当前位置: 首页 > news >正文

微服务架构下的java应用工程结构实践

1. 为什么需要「工程结构」?

在单体时代,一个 src/main/java 往往就能跑完整业务;到了微服务,每个服务由 1-3 个小组、5-10 名工程师共同维护,生命周期长达数年。此时「工程结构」不再只是目录,而是一份多人协作“约定由于配置”的契约,它有这些好处:

  • 新人 On-boarding:代码在哪里找?该放哪里?一眼即知。
  • 长期可维护:业务膨胀后仍能快速定位、修改、回滚。
  • 自动化友好:目录即边界,CI、测试、覆盖率、安全扫描都可按模块并行。

2. 模块规范 & Java 类后缀最佳实践

下面是pom依赖关系

模块职责类后缀约定
startspring boot启动入口,继承测试放在这个子工程test源码下,所有子工程中的服务都可以在这里写复杂的继承测试无业务代码,仅启动入口和继承测试代码
gateway统一接入、路由、鉴权、限流、异常兜底处理,调用biz层,实现api包中的接口能力,消费消息队列的数据ServiceImpl / Consumer / Handler / Router
api对外暴露的接口 & 请求/响应模型DTO / VO / Request / Response / Result / Service / Constants / Enum
biz围绕业务逻辑,调用core、integration进行业务流程编排、事务、校验,尽量避免biz直接调用daoBizService / BizServiceImpl/ Helper / Executor
integration调用外部 RPC / 发外域模型的消息 / 依赖模型防腐层,所有DO都需遵循模型最小化,不要把依赖方的模型直接当成自己的模型Client / ClientImpl / Producer / DO / Request
core围绕核心领域模型的管理,调用dao进行持久化模型和核心领域模型的转换、组合、同步。比如:一个核心领域模型可能管理多个持久化数据表、同时需要维护持久化和缓存的一致性、还需要把数据的变更下通知给下游应用。领域模型不需要后缀 / CoreService
dao数据访问:持久化存储、缓存。和持久化表、缓存kv结构一一映射DO / Mapper
common复用常量、枚举、工具、异常Constants / Enum / Util / Exception
后缀就是语义化阅读线索。看到OrderBizService就知道是Biz层业务逻辑处理,看到OrderCoreService就知道是订单核心领域模型处理 OrderClient 知道是外部调用;看到 OrderDao 知道是领域存储;看到 OrderMapper 知道是 MyBatis XML 映射。

3. 树形工程目录 & 示例类

下面给出一个典型 order-service 应用的完整目录树。
每个叶子包都提供一个示例类名,可根据需要直接拷贝到 IDE 体验,为了缩短内容,把单测目录省略了,需要的话可自行添加。

order-service ├── start │ └── src/main/java │ │ └── com.example.order.starter │ │ └── Application.java │ └── src/main/resources │ │ ├── application.properties │ │ ├── application-pre.properties │ │ ├── application-dev.properties │ │ └── logback.xml │ └── src/test/java │ │ └── com.example.order │ │ └── ApplicationTest.java │ └── src/test/resources │ ├── application-test.properties │ └── logback.xml ├── api │ └── src/main/java │ └── com.example.order.api │ ├── OrderQueryService.java │ ├── OrderWriteService.java │ ├── result │ │ └── BaseResult.java │ │ └── ListResult.java │ │ └── PageResult.java │ ├── request │ │ └── OrderCreateRequest.java │ ├── response │ │ └── OrderCreateResponse.java │ ├── constants │ │ └── OrderFeatureConstants.java │ ├── enums │ │ └── OrderStatusEnum.java │ └── dto │ └── OrderDTO.java ├── gateway │ └── src/main/java │ └── com.example.order.gateway │ ├── impl │ │ ├── OrderQueryServiceImpl.java │ │ └── OrderWriteServiceImpl.java │ ├── filter │ │ └── AuthFilter.java │ └── router │ └── OrderRouter.java ├── biz │ └── src/main/java │ └── com.example.order.biz │ ├── OrderBizService.java │ ├── impl │ │ └── OrderBizServiceImpl.java │ ├── model │ │ └── OrderBO.java │ ├── helper │ │ └── OrderHelper.java │ ├── executor │ │ └── PaymentExecutor.java │ └── validator │ └── OrderValidator.java ├── integration │ └── src/main/java │ └── com.example.order.integration │ ├── inventory │ │ ├── InventoryClient.java │ │ ├── request │ │ │ └── InventoryRequest.java │ │ └── model │ │ └── InventoryDO.java │ ├── user │ │ ├── UserQueryClient.java │ │ ├── request │ │ │ └── UserQueryRequest.java │ │ └── model │ │ └── UserDO.java │ └── producer │ └── OrderEventProducer.java ├── core │ └── src/main/java │ └── com.example.order.core │ ├── OrderCoreService.java │ └── model │ └── Order.java ├── dao │ └── src/main/java │ │ └── com.example.order.dao │ │ ├── OrderDao.java │ │ ├── mapper │ │ │ └── OrderMapper.java │ │ ├── do │ │ │ └── OrderDO.java │ │ └── impl │ │ └── OrderDaoImpl.java │ └── src/main/resources │ │ └── mapper │ │ └── OrderMapper.xml └── common └── src/main/java └── com.example.order.common ├── constant │ └── BizCodeConstants.java ├── enum │ └── OrderStatusEnum.java ├── util │ └── DateUtil.java └── exception └── BizException.java
说明:
每个子模块(gateway、api…)在真实项目里是一个 Maven module,不建议用package来隔离,因为只有maven module才能在编译阶段杜绝不合理的依赖,比如:integration依赖dao就是不合理的
如果团队和业务规模更大,可以把 biz 再拆成 biz-A、biz-B 两个子模块。
测试代码放在同级的 src/test/java,保持镜像结构,只有集成测试才放到start中或者独立一个qatest的模块专门放置所有的集成类。

4. 经验小结

  1. module即边界:严禁跨层调用(如gateway 直接依赖dao )。
  2. 统一命名:各层的类名都有统一的后缀,见类名就能知道它在哪一层、在当前层使用这个类是否合适。
  3. 代码生成:利用 MyBatis Generator / MapStruct 自动生成 DO、Mapper,减少重复劳动。
  4. 演进友好:不一定这个结构完全可以套用到你现在的工程中,取其精华去其糟粕。
  5. 广泛应用:尽量让公司所有java业务系统都采用相同的module结构和命名,那么人员变动、组织调整等的成本会大幅降低。

坚持半年,你会惊喜地发现:

  • 新人一周即可提 PR;
  • 重构只影响一个模块;
  • 线上故障定位从小时级降到分钟级。
http://www.jsqmd.com/news/326382/

相关文章:

  • 泰州网络科技公司怎么选,分析锦昊网络市场口碑与基本信息
  • 温室大棚远程控制系统解决方案:多维度在线监测,数据化细管农业
  • 分析2026年摇粒绒生产企业,口碑好且值得选的品牌汇总
  • 2026年河南广告公司推荐:本地化营销场景深度评测与权威排名解析
  • 虚拟线程生产事故复盘:警惕高性能背后的陷阱
  • 黑客必备利器:如何在系统上安装和使用 CobaltStrike?黑客技术零基础入门到精通实战教程
  • 格式总出错?一键生成论文工具,千笔ai写作 VS WPS AI,专科生专属神器!
  • 收藏备用|Java开发者转型大模型:零算法焦虑,靠自身优势抢占AI风口(小白友好)
  • 京东e卡回收多少折,一招洞悉2026年回收价格表
  • 全网最全10个降AIGC网站 千笔·降AIGC助手帮你解决AI率过高问题
  • BUUCTF刷题MISC[一](29-32)
  • 【SSM毕设全套源码+文档】基于ssm的优选农产品销售管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • DAMPT08S-YD铂热电阻温度采集模块:2-8路灵活选配 隔离485抗干扰
  • 技术演进中的开发沉思-344:Javac 编译器(中)
  • 工业级电力测温模块!DAMPT08S-YD:2/4/6/8路 隔离485通讯抗电磁干扰
  • 【SSM毕设源码分享】基于SSM+VUE的作业管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 2.3.蓝桥杯-正则问题
  • 2026年郑州企业用工风险咨询机构推荐:解决用工难题必备指南
  • 2026年山东广告公司推荐:基于实战案例与稳定性的TOP5权威榜单
  • Spring 配置 Springboot分页技术
  • 【SSM毕设全套源码+文档】基于ssm的学生选课系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 本地汽车托运物流平台哪家强?2026性价比之选,异地汽车托运物流技术领航者深度解析
  • 【SSM毕设源码分享】基于SSM+VUE的专业课程教学过程管理系统的教师模块的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 2026年值得推荐的小磨香油供应商,口碑好的选哪家
  • 【SSM毕设全套源码+文档】基于ssm的商城系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 2026年山东广告公司权威测评报告:基于百家客户匿名反馈的口碑深度解析
  • OFD文件处理神器!免费阅读转换还能加表情签章
  • 2026年山东广告公司推荐:多场景营销实战排名,针对品牌增长与效果失衡痛点
  • 总结纯芝麻酱品牌,驻马店源头厂家排名前十的有哪些?
  • 图片压缩神器!648KB小工具批量处理不损画质