项目规范
1、JDK版本
A、推荐用JDK 21, 长期 LTS(虚拟线程、分代ZGC);
B、追求稳定用JDK 17(生态极度成熟,全网踩坑案例最多,几乎无兼容雷区)2、SpringBoot
A、推荐用Spring Boot 3.3.13,存量项目基数极大,社区自发修复方案充足
(3.4.x 停免费维护,依赖基线高,老中间件适配差,3.5.x 刚停免费维护,大量 Breaking 变更,生态兼容差);
B、全新项目、中间件版本较新、团队能接受少量适配 → 优先 4.1.0(当前最新 GA 正式版)
C、微服务、Nacos/Seata/MP 等国内组件多、不想踩新坑 → 选 4.0.7(4.0 分支最终稳定补丁)3、JAVA 微服务架构
| 架构方案 | 完整技术栈 | 通信模式 | 注册配置中心 | 适用场景 |
|---|---|---|---|---|
| 首选 | SpringBoot3 + Spring Cloud Alibaba + Nacos + Spring Cloud Gateway + OpenFeign | 全链路HTTP Feign调用 | Nacos(注册+配置一体) | 能快速开发,中型项目架构,不追求极致高性能, |
| 备选 | SpringBoot3 + Spring Cloud Alibaba + Nacos + Spring Cloud Gateway + Dubbo3 | 外网HTTP、内网Dubbo RPC | Nacos(注册+配置一体) | 极致高并发要求,TPS要求3000+ |
注:Spring Cloud Alibaba 优势:一站式全家桶,减少中间件部署数量,运维成本低;
4、微服务项目结构
注:整体项目生态建议5个应用以内,如果一定有必要超出,则可以找架构组讨论. 参考项目如附件《hina-cloud-base》
项目介绍
文件结构
com.公司名.项目名.模块名为根文件目录,比如(com.hina.cloud.base为项目的根文件目录)
根文件目录下有springboot启动类,springboot默认扫描启动类所在文件目录及子文件目录
根文件目录下分为五个一级文件夹,分别为endpoint、common、config、application、domain,代表整个项目结构的五大模块
endpoint
暴露的服务端点 微服务请求入口 来自不同客户端的服务接口应该区分开来,放在不同的子文件夹目录下,如:[web]、[h5]、[inner]。
其中web代表给web前端使用的接口,h5代表给移动端使用的接口,inner代表给内部其它微服务调用的接口。
之所以这样区分,是因为不同客户端请求对安全性的考虑不一样.
inner接口都是内部微服务之间调用,一般不考虑鉴权等问题.
对于web、h5端的请求都是来自网关转发, 而且都属于C端的请求, C端需要有用户注册、用户登陆态维护以及鉴权, 这些功能都被业务系统所前置.
所以一般后端服务不能暴露在公网上, 但是后端的服务又往往需要区分请求是来自哪个用户.
现在的通用做法是gateway或者auth系统通过token和用户id之间的转换放在http报文头中供后端业务系统使用, 这个特征在以H5为主要形态的移动端更为突出.
http报文头往往还要承载更多属性和功能,基本需要Filter模块单独来处理, 比如说app的黑名单过滤、权限等功能, web端特别是管理系统就相对简单多.
所以把服务于不同客户端的请求接口分类开来, 方便开发.application
业务模块,endpoint是服务入口,application是业务得实现,跟业务相关的都放在这里面。其中manager文件夹用于放对事务封装的代码;
facade是调用外部服务的封装,业务代码直接使用封装api,屏蔽对事务已经外部服务调用所涉及的异常、熔断、结果处理等相关的细节处理,这样
使得业务代码逻辑更清晰,有利于代码的分层、重用和维护。
common
公共模块,其它模块都能使用到的公共代码放在这里面,比如:枚举、异常、http 报文头的处理、filter、工具类等
config
三方组件使用、配置模块,微服务更加推荐组件的启用、配置使用注解的方式引入,而不是传统的通过加载配置文件,因为前者更加高效。
domain
领域模块,可以把这个模块理解为外交部,这里面是跟外部系统交互比较复杂,考虑的点比较多的代码,比如feign调用,数据库的使用,
业务模型的中间类、外部接口模型、数据模型等等,把他们放在一个模块里,便于统一维护管理。
5、项目编程规范
- 参考《阿里巴巴Java开发手册.pdf》
6、数据库连接池配置
A、通用标准生产配置
hikari:
# 最小空闲连接,维持基础常驻连接,避免频繁创建销毁
minimum-idle: 5
# 连接池最大连接数,普通业务单服务标准值
maximum-pool-size: 20
# 获取连接等待超时时间,3秒拿不到连接直接抛出异常
connection-timeout: 3000
# 空闲连接超时,10分钟无使用自动回收
idle-timeout: 600000
# 连接最大生命周期,30分钟强制销毁,小于MySQL wait_timeout
max-lifetime: 1800000
# 连接泄漏检测阈值,超过3秒未释放打印日志排查长事务
leak-detection-threshold: 3000
# 后台校验连接可用性SQL
connection-test-query: SELECT 1B、并发专用 HikariCP
hikari:
pool-name: high-conn-pool
# 高并发:最小空闲保持活跃连接,避免频繁创建
minimum-idle: 10
# 核心上限:单服务 30~60,多服务总和 < MySQL max_connections-30
maximum-pool-size: 40
# 获取连接超时缩短,快速失败,不堆积线程
connection-timeout: 1500
# 闲置10分钟回收
idle-timeout: 600000
# 连接30分钟强制销毁,小于mysql wait_timeout(默认8h)
max-lifetime: 1800000
# 高并发必开:后台定时检测无效连接
leak-detection-threshold: 2000
connection-test-query: SELECT 1