支付中台系统,基于 jeepay 重构了 2 天,目标是做企业部署发行版遇到的问题分享

5 月 22 日
 5wunian

Spring Boot 3.x 循环依赖实战:从 allow-circular-references 到纯 DAG ,一个支付系统的重构之旅

项目背景:Jeepay 计全支付,Spring Boot 3.3.7 + MyBatis-Plus + Vue 3 ,多模块 Maven 项目。

  1. 前端集成引发的连锁反应

原本前后端分离部署( Nginx + 独立前端容器),想把前端 dist 直接打进 JAR 简化部署。几个坑:

  1. 发行包瘦身:260MB → 120MB

三个模块的 fat JAR 共 288MB ,其中 130 个公共依赖(72MB) 重复存储 3 次。方案:

  1. 循环依赖根治

去掉 allow-circular-references: true 后直接启动,Spring Boot 3.x 严格检测报出完整依赖链:

┌─────┐ │ SysConfigService 自引用 (删 @Autowired self ,直接用 this) ↑ ↓ │ IsvInfoService 自引用 (同上)

修复策略:

关键认知:

  1. 依赖只能单向流动。找到"谁在反向调用"就是断环点。

  2. 大多数循环依赖是 CRUD 委托导致的。ServiceImpl 包装 BaseMapper ,循环往往是因为 A 需要 B 的 getById(),B 需要 A 的 count()——直接用 Mapper 替代 Service 注入,不改任何业务逻辑。

  3. 不要用 @Lazy 、不要用 allow-circular-references ,这些都是掩耳盗铃。Spring Boot 3.x 默认禁止循环是为了逼你写出正确的分层。

  4. 最终效果

┌───────────────────────────┬────────┬───────────────┐ │ 指标 │ 修复前 │ 修复后 │ ├───────────────────────────┼────────┼───────────────┤ │ 发行包大小 │ 260 MB │ 120 MB (-54%) │ ├───────────────────────────┼────────┼───────────────┤ │ 循环依赖 │ 5 个 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ allow-circular-references │ true │ 已移除 │ ├───────────────────────────┼────────┼───────────────┤ │ @Lazy │ 2 处 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ 启动时间 │ ~8s │ ~4s │ └───────────────────────────┴────────┴───────────────┘

1634 次点击
所在节点    程序员
9 条回复
5wunian
5 月 22 日
还增加了 openlist 的 s3 存储支持。
5wunian
5 月 22 日
有自建需求的留言邮箱。
5wunian
5 月 22 日
从开源建立的 jeepay ,到商业片的发行包,中间有一大堆需要配置配置的东西。为此做了大量的自动化部署工具脚本。
5wunian
5 月 22 日
目前已经完成了一个应用接入支付。有需要接入支付的,可以联系,提供技术支持。
5wunian
5 月 22 日
已经完成了支付备案,网站备案,可以完成全链路的动作。
Mandyer
5 月 22 日
YW9odW4yMDE4QGdtYWlsLmNvbQ==
楼主来一份,谢谢
5wunian
5 月 23 日
@Mandyer 已发
5wunian
5 月 23 日
通过网盘分享的文件:jeepay-release-3.1.5.tar.gz
链接: https://pan.baidu.com/s/1WWfJy_4HumfVsRZEcIdHqw?pwd=2q6j 提取码: 2q6j
--来自百度网盘超级会员 v6 的分享
今天又重新搞了下
5wunian
5 月 23 日
将生产环境配置和 local 环境打包方案更新了一下。毕竟 java 上部署方案动不动就是几百兆。一个包动不动就是几十兆。这就是源头上 java 的差距离。没有把未使用的代码干掉。目前只是 lib 包共享,就直接降了一倍的分发包体积。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1214823

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX