
🌈 个人主页: Hygge_Code
🔥 热门专栏:从0开始学习Java | Linux学习| 计算机网络
💫 个人格言: "既然选择了远方,便不顾风雨兼程"

文章目录
- [开发日记 | 第一天](#开发日记 | 第一天)
-
- [今日总结 🤔🤔🤔](#今日总结 🤔🤔🤔)
- [系统架构设计图 ⚙️⚙️⚙️](#系统架构设计图 ⚙️⚙️⚙️)
-
- [微服务架构图功能梳理 📊](#微服务架构图功能梳理 📊)
-
- [1. 客户端接入层](#1. 客户端接入层)
- [2. API 网关层](#2. API 网关层)
- [3. 注册与配置中心](#3. 注册与配置中心)
- [4. 微服务核心层(开发的核心)](#4. 微服务核心层(开发的核心))
- [5. 数据与存储层](#5. 数据与存储层)
- [6. 运维与监控层](#6. 运维与监控层)
- [整体请求流程 🔄](#整体请求流程 🔄)
- 涵盖的Java核心技术栈
- 服务器环境和开发环境对应版本
- [开发管控平台和任务发布工具 🛠️](#开发管控平台和任务发布工具 🛠️)
- [在开发前后端时对数据模型的规约 🧾🍂🧾](#在开发前后端时对数据模型的规约 🧾🍂🧾)
-
- [领域对象描述 🍋🟩](#领域对象描述 🍋🟩)
- [各层命名规范 🍋🟩](#各层命名规范 🍋🟩)
- [今天的核心关注文件(aips、common、domain) 🐦🔥](#今天的核心关注文件(aips、common、domain) 🐦🔥)
- 完成nacos配置
- [通过 Knife4j 生成 API 文档实现接口可视化 🥝](#通过 Knife4j 生成 API 文档实现接口可视化 🥝)
- [启动参数校验 --- @Validated注解](#启动参数校验 --- @Validated注解)
- [使用Apifox测试验证码插件 🍂](#使用Apifox测试验证码插件 🍂)
开发日记 | 第一天
今日总结 🤔🤔🤔
- 第一次使用团队协作管理系统 --- 云效工作平台
- 成功把原型参考系统跑了起来
- 完成了
Mysql、Redis、Nacos的配置搭建 - 了解到了做一个团体项目时前后端开发会对数据模型有一个规范约定
- 学习使用
Nacos实现统一配置管理 - 学到了
Knife4j接口文档工具的配置与使用 - 学会使用
Apifox进行后端接口调试与测试
系统架构设计图 ⚙️⚙️⚙️
项目主体骨架基于
Spring Cloud Alibaba生态体系,使用MySQL进行数据持久化管理,采用Vue3生态体系与Element Puls UI框架完成前端制作,同时项目提供C++微服务开发解决方案与集成、使用Jenkins实现CD/CI

微服务架构图功能梳理 📊
1. 客户端接入层
| 组件 | 功能 |
|---|---|
| 手机/PC/服务器 | 前端/客户端发起请求的入口 |
| Nginx | 负载均衡:将请求分发到多个 API 网关,避免单点故障,提升并发能力 |
2. API 网关层
| 组件 | 功能 |
|---|---|
| Gateway 集群 | 统一 API 入口:路由转发、请求过滤、限流熔断、统一认证 |
| OAuth2 | 身份认证与授权:确保只有合法用户/服务才能访问接口 |
| Sentinel | 服务熔断限流:防止雪崩效应,保护核心服务 |
| Ribbon | 客户端负载均衡:在网关层将请求分发到不同的服务实例 |
3. 注册与配置中心
| 组件 | 功能 |
|---|---|
| Nacos 注册中心集群 | 服务注册与发现:所有微服务启动后注册到这里,网关/服务消费方能获取服务列表 |
| Nacos 配置中心集群 | 统一配置管理:集中管理所有微服务的配置文件,支持动态刷新,无需重启服务 |
4. 微服务核心层(开发的核心)
| 模块 | 功能 |
|---|---|
| 服务提供集群 | 对外提供具体业务接口的微服务(如用户服务、订单服务) |
| 服务消费集群 | 调用其他服务的微服务,通过 OpenFeign 实现声明式服务调用 |
| OpenFeign | 声明式服务调用:简化服务间通信,像调用本地方法一样调用远程接口 |
5. 数据与存储层
| 组件 | 功能 |
|---|---|
| MySQL | 主业务数据存储:核心业务数据持久化 |
| Redis | 缓存数据存储:热点数据缓存,提升查询性能 |
| MongoDB | 文档类型数据存储:适合存储非结构化/半结构化数据 |
| FastDFS/OSS | 文件存储:图片、视频等大文件的分布式存储 |
| Seata | 分布式事务管理:保证跨服务操作的数据一致性 |
| RocketMQ | 消息代理:异步解耦、流量削峰 |
6. 运维与监控层
| 组件 | 功能 |
|---|---|
| Jenkins | 自动部署:CI/CD 流水线,实现代码提交后自动构建、测试、部署 |
| Docker | 容器化:将服务与依赖打包成容器,保证环境一致性,方便快速扩缩容 |
| Spring Boot Admin | 服务监控中心:实时监控微服务的健康状态、内存、线程等指标 |
| ELK 栈 | 日志系统:Elasticsearch + Logstash + Kibana,集中收集、分析、可视化服务日志 |
整体请求流程 🔄
- 客户端 → Nginx(负载均衡) → Gateway(路由/认证/限流)
- Gateway 从 Nacos 获取服务列表 → Ribbon 负载均衡 → 目标微服务
- 微服务从 Nacos 获取配置,通过 OpenFeign 调用其他服务
- 数据读写 MySQL/Redis/MongoDB,通过 RocketMQ 异步处理
- 日志收集到 ELK,状态上报给 Spring Boot Admin
- 运维通过 Jenkins + Docker 实现自动化部署
涵盖的Java核心技术栈

服务器环境和开发环境对应版本

开发管控平台和任务发布工具 🛠️
代码托管平台

任务发布工具

在开发前后端时对数据模型的规约 🧾🍂🧾
以下是本次项目架构体系的统一规范要求:
领域对象描述 🍋🟩
-
DO(Data Object ):数据库实体映射,此对象与数据库表结构一一对应,通过DAO层向上传输数据源对象
例如:user 表有 id/name/age/password 字段,UserDO 就有这 4 个属性,和表结构完全一致 -
DTO(Data Transfer Object ):数据传输对象,Service 或 Manager 向外传输的对象【用来 "精简、脱敏、重组"DO 的数据】
例如:UserAddDTO 只包含 name/age,UserDetailDTO 包含 id/name/age,隐藏敏感字段 password -
BO(Business Object ):业务对象,可以由 Service 层输出的封装业务逻辑的对象
例如:将 UserDO + ProductDO + OrderDO,封装成 OrderBO 来执行所需的业务逻辑 -
Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输 -
VO(View Object ):显示层对象,给 前端 / 模板引擎 展示用的数据,完全贴合页面展示需求
各层之间的关系如下图所示,里面包含了领域模型的传递过程:
各层命名规范 🍋🟩
-
Controller/Service/DAO层方法命名规约- 获取单个对象的方法用
query/get/select做前缀 - 获取多个对象的方法用
query/list/select做前缀 - 获取统计值的方法用
count/count/count做前缀 - 插入的方法用
add/save/insert做前缀 - 删除的方法用
remove/remove/delete做前缀 - 修改的方法用
modify/update/update做前缀 - API请求路径命名,前缀(如:功能模块名称)+ 功能名称(多个单词使用-连接),比如下面的示例:
/sys/query-by-name、/user/add-user、/user/modify-password
- 获取单个对象的方法用
-
领域模型命名规约
- DO:
xxxDO,xxx即为数据表名 - DTO:
xxxDTO,xxx为业务领域相关的名称 - Query:
xxxQuery,xxx为业务领域相关的名称 - VO:
xxxVO,xxx一般为网页名称 POJO是 DO/DTO/BO/VO/Query 的统称,禁止命名成 xxxPOJO
- DO:
今天的核心关注文件(aips、common、domain) 🐦🔥

以上三个文件的作用和要求:
-
eams-apis
- 用于定义
API接口,方便后续实现,所有API接口需要定义在这里 - 包命名规则
- 包名由小写字母组成(如果多个单词要写成多个包或者用单词缩写),基础包名为
com.zeroone.star.project,子包第一个包名用小组名命名,然后下级包名是模块名称,例子:- j1组开发系统主页的接口,包名可以命名为
com.zeroone.star.project.j1.homepage - j2组开发系统设置的接口,包名可以命名为
com.zeroone.star.project.j2.sys
- j1组开发系统主页的接口,包名可以命名为
- 包名由小写字母组成(如果多个单词要写成多个包或者用单词缩写),基础包名为
- 用于定义
-
eams-common
- 提供公用配置、公用组件、公用工具类,公用的内容都定义在这里
-
eams-domain
- 定义给个领域模型需要的实体,除了
do层的领域模型,其它层的领域模型都需要定义在这里 - 包名由小写字母组成(如果多个单词要写成多个包或者用单词缩写),基础包名为
com.zeroone.star.project.[dto|query|vo]。子包第一个包名用小组名命名,然后下级包名是模块名称,例子:- j1组开发系统主页的Dto模型包名:com.zeroone.star.project.dto.j1.homepage
- j2组开发系统设置的Query模型包名:com.zeroone.star.project.query.j2.sys
- 定义给个领域模型需要的实体,除了
完成nacos配置

通过 Knife4j 生成 API 文档实现接口可视化 🥝
API文档界面

java
@RestController
@RequestMapping("/sample")
@Api(tags = "sample")
public class SampleController implements SampleApis {
@Resource
ISampleService service;
@Resource
MsSampleMapper msSampleMapper;
@PostMapping
@ApiOperation(value = "添加示例")
@Override
public JsonVO<String> addSample(SampleAddDTO addDto) {
Sample sample = msSampleMapper.addDtoToDo(addDto);
if(service.save(sample)){
return JsonVO.success(sample.getId());
}
return JsonVO.fail(null);
}
@PutMapping
@ApiOperation(value = "修改示例")
@Override
public JsonVO<String> modifySample(SampleDTO dto) {
if(service.updateById(msSampleMapper.dtoToDo(dto))){
return JsonVO.success(dto.getId());
}
return JsonVO.fail(null);
}
@GetMapping
@ApiOperation(value = "查询所有示例")
@Override
public JsonVO<PageDTO<SampleDTO>> queryAll(SampleQuery condition) {
return JsonVO.success(service.listAll(condition));
}
@GetMapping("/{id}")
@ApiOperation(value = "查询指定id的示例")
@Override
public JsonVO<SampleDTO> queryById(String id) {
return JsonVO.success(service.getById(id));
}
@DeleteMapping
@ApiOperation(value = "删除示例")
@Override
public JsonVO<List<String>> removeSample(
@ApiParam (value = "编号列表", required = true,example = "[\"1\",\"2\"]")
@RequestBody List<String> ids) {
if(service.removeByIds(ids)){
return JsonVO.success(ids);
}
return JsonVO.fail(null);
}
}
请求响应成功

启动参数校验 --- @Validated注解
编写GlobalExceptionHandler类,在需要校验的地方加上@Validated注解

使用Apifox测试验证码插件 🍂

如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!

