【项目开发日记 | Java架构】第一天


🌈 个人主页: 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测试验证码插件 🍂)

开发日记 | 第一天

今日总结 🤔🤔🤔

  • 第一次使用团队协作管理系统 --- 云效工作平台
  • 成功把原型参考系统跑了起来
  • 完成了MysqlRedisNacos的配置搭建
  • 了解到了做一个团体项目时前后端开发会对数据模型有一个规范约定
  • 学习使用 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,集中收集、分析、可视化服务日志

整体请求流程 🔄

  1. 客户端 → Nginx(负载均衡) → Gateway(路由/认证/限流)
  2. Gateway 从 Nacos 获取服务列表 → Ribbon 负载均衡 → 目标微服务
  3. 微服务从 Nacos 获取配置,通过 OpenFeign 调用其他服务
  4. 数据读写 MySQL/Redis/MongoDB,通过 RocketMQ 异步处理
  5. 日志收集到 ELK,状态上报给 Spring Boot Admin
  6. 运维通过 Jenkins + Docker 实现自动化部署

涵盖的Java核心技术栈

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

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

代码托管平台

任务发布工具

在开发前后端时对数据模型的规约 🧾🍂🧾

以下是本次项目架构体系的统一规范要求:

领域对象描述 🍋‍🟩

  • DOData Object ):数据库实体映射,此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象
    例如:user 表有 id/name/age/password 字段,UserDO 就有这 4 个属性,和表结构完全一致

  • DTOData Transfer Object ):数据传输对象,Service 或 Manager 向外传输的对象【用来 "精简、脱敏、重组"DO 的数据
    例如:UserAddDTO 只包含 name/age,UserDetailDTO 包含 id/name/age,隐藏敏感字段 password

  • BOBusiness Object ):业务对象,可以由 Service 层输出的封装业务逻辑的对象
    例如:将 UserDO + ProductDO + OrderDO,封装成 OrderBO 来执行所需的业务逻辑

  • Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输

  • VOView 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:xxxDOxxx 即为数据表名
    • DTO:xxxDTOxxx 为业务领域相关的名称
    • Query:xxxQueryxxx为业务领域相关的名称
    • VO:xxxVOxxx 一般为网页名称
    • POJO 是 DO/DTO/BO/VO/Query 的统称,禁止命名成 xxxPOJO

今天的核心关注文件(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
  • 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测试验证码插件 🍂


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

相关推荐
我爱学习好爱好爱1 小时前
Kubernetes 1.29集群上部署Java网站项目
java·容器·kubernetes
至为芯1 小时前
IP2075_34S至为芯支持C口快充的30W功率AC/DC芯片
c语言·开发语言
DJ斯特拉2 小时前
自定义jar包导入maven&&注册第三方bean
java·maven·jar
AI_56782 小时前
基于智优达平台的Python教学实践:从环境搭建到自动评测
开发语言·前端·人工智能·后端·python
j_xxx404_2 小时前
力扣困难算法精解:串联所有单词的子串与最小覆盖子串
java·开发语言·c++·算法·leetcode·哈希算法
嘉琪0012 小时前
前端数组核心方法(高级视角 + 场景 + 精简)——————2026 0309
开发语言·前端·javascript
会编程的土豆2 小时前
Set 深度解析:去重、唯一性与你的智能抽屉
java·开发语言·后端·数据结构与算法
java1234_小锋2 小时前
Java高频面试题:JVM内存为什么要分代?
java·开发语言·jvm
筱砚.2 小时前
C++——lambda
开发语言·c++·算法