微服务架构下的java应用工程结构实践
1. 为什么需要「工程结构」在单体时代一个 src/main/java 往往就能跑完整业务到了微服务每个服务由 1-3 个小组、5-10 名工程师共同维护生命周期长达数年。此时「工程结构」不再只是目录而是一份多人协作“约定由于配置”的契约它有这些好处新人 On-boarding代码在哪里找该放哪里一眼即知。长期可维护业务膨胀后仍能快速定位、修改、回滚。自动化友好目录即边界CI、测试、覆盖率、安全扫描都可按模块并行。2. 模块规范 Java 类后缀最佳实践下面是pom依赖关系模块职责类后缀约定startspring boot启动入口继承测试放在这个子工程test源码下所有子工程中的服务都可以在这里写复杂的继承测试无业务代码仅启动入口和继承测试代码gateway统一接入、路由、鉴权、限流、异常兜底处理调用biz层实现api包中的接口能力消费消息队列的数据ServiceImpl / Consumer / Handler / Routerapi对外暴露的接口 请求/响应模型DTO / VO / Request / Response / Result / Service / Constants / Enumbiz围绕业务逻辑调用core、integration进行业务流程编排、事务、校验尽量避免biz直接调用daoBizService / BizServiceImpl/ Helper / Executorintegration调用外部 RPC / 发外域模型的消息 / 依赖模型防腐层所有DO都需遵循模型最小化不要把依赖方的模型直接当成自己的模型Client / ClientImpl / Producer / DO / Requestcore围绕核心领域模型的管理调用dao进行持久化模型和核心领域模型的转换、组合、同步。比如一个核心领域模型可能管理多个持久化数据表、同时需要维护持久化和缓存的一致性、还需要把数据的变更下通知给下游应用。领域模型不需要后缀 / CoreServicedao数据访问持久化存储、缓存。和持久化表、缓存kv结构一一映射DO / Mappercommon复用常量、枚举、工具、异常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. 经验小结module即边界严禁跨层调用如gateway 直接依赖dao 。统一命名各层的类名都有统一的后缀见类名就能知道它在哪一层、在当前层使用这个类是否合适。代码生成利用 MyBatis Generator / MapStruct 自动生成 DO、Mapper减少重复劳动。演进友好不一定这个结构完全可以套用到你现在的工程中取其精华去其糟粕。广泛应用尽量让公司所有java业务系统都采用相同的module结构和命名那么人员变动、组织调整等的成本会大幅降低。坚持半年你会惊喜地发现新人一周即可提 PR重构只影响一个模块线上故障定位从小时级降到分钟级。

相关新闻

DAMPT08S-YD铂热电阻温度采集模块:2-8路灵活选配 隔离485抗干扰

DAMPT08S-YD铂热电阻温度采集模块:2-8路灵活选配 隔离485抗干扰

铂热电阻温度采集模块凭借 高精度、高稳定性、抗干扰能力强、适配工业环境 等核心优势,广泛应用于电力、工业制造、能源化工、智慧建筑、轨道交通等多个行业,是工业温度监测与自动化控制系统的关键硬件。一、产品参数 通道数量:2/4/6/8路 数据…

2026/7/3 14:38:40 阅读更多 →
全网最全10个降AIGC网站 千笔·降AIGC助手帮你解决AI率过高问题

全网最全10个降AIGC网站 千笔·降AIGC助手帮你解决AI率过高问题

全网最全10个降AIGC网站 千笔降AIGC助手帮你解决AI率过高问题 AI降重工具:让论文更自然,让查重更轻松 在自考论文写作过程中,越来越多的学生发现,使用AI生成的内容虽然高效,但往往面临AIGC率过高的问题。这不仅影响论…

2026/7/3 14:38:40 阅读更多 →
格式总出错?一键生成论文工具,千笔ai写作 VS WPS AI,专科生专属神器!

格式总出错?一键生成论文工具,千笔ai写作 VS WPS AI,专科生专属神器!

格式总出错?一键生成论文工具,千笔ai写作 VS WPS AI,专科生专属神器! 随着人工智能技术的迅猛发展,AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。越来越多的学生开始借助这些工具来提升写作效率、降低写作…

2026/7/3 1:02:49 阅读更多 →

最新新闻

解决90%的测试难题:openEuler编译器测试套件常见问题与解决方案终极指南

解决90%的测试难题:openEuler编译器测试套件常见问题与解决方案终极指南

解决90%的测试难题:openEuler编译器测试套件常见问题与解决方案终极指南 【免费下载链接】compiler-test Compiler-test repo contains functional test suites for two components: gcc and openjdk, including dejagnu, jtreg, etc 项目地址: https://gitcode.c…

2026/7/3 23:10:13 阅读更多 →
BambuStudio 编译实战

BambuStudio 编译实战

目录 strawberry安装 下载的模型地址: mkdir E:\BambuSlicer-depsbuild_win -s all -d "E:\BambuSlicer-deps" strawberry安装 strawberry-perl-5.42.2.1-64bit 运行安装:双击下载的 .msi 文件,按照安装向导的提示操作即可。建…

2026/7/3 23:08:12 阅读更多 →
STM32F765ZI与DRV8213的智能散热系统设计

STM32F765ZI与DRV8213的智能散热系统设计

1. 项目背景与核心需求解析 在汽车电子和工业控制领域,嵌入式系统的散热管理一直是个棘手问题。随着处理器性能提升和空间限制加剧,传统被动散热方案已无法满足需求。我最近参与的某车载信息娱乐系统项目就遇到了这个难题——当STM32F765ZI全速运行且环境…

2026/7/3 23:06:12 阅读更多 →
小红书内容采集与批量下载神器:XHS-Downloader完整使用指南

小红书内容采集与批量下载神器:XHS-Downloader完整使用指南

小红书内容采集与批量下载神器:XHS-Downloader完整使用指南 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接…

2026/7/3 23:06:12 阅读更多 →
告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐

告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐

引言 随着卡点剪辑的普及,通用型 BGM 同质化问题日益凸显,数据显示 2026 年头部热门卡点音乐的重复使用率高达 68%,大量卡点视频因配乐撞车导致用户审美疲劳。对于追求创意与辨识度的创作者而言,挖掘小众优质卡点音乐资源成为突破…

2026/7/3 23:06:12 阅读更多 →
【Bug已解决】This model‘s maximum context length is X tokens. However, you requested Y tokens 解决方案

【Bug已解决】This model‘s maximum context length is X tokens. However, you requested Y tokens 解决方案

【Bug已解决】This models maximum context length is X tokens. However, you requested Y tokens 解决方案 1. 问题描述 在自己搭建 Agent Harness、调用大模型 API 时,随着对话轮次增多、工具调用结果不断累积,很多人会在某一次请求突然收到这样的报错…

2026/7/3 23:02:10 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻