CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
SERIES / JHIPSTER / P-244 · JHipster 项目开发

JHipster 开发 30:复盘——JHipster 三年使用总结

写第 1 篇的时候我们刚把主系统从 JHipster 6 升到 8,如今 30 篇写完,生产上跑的是 9.x(Spring Boot 4 + Angular 21),中途还拆了微服务。作为系列收官,这篇不教新技术,只做一件事:把三年的实践放在天平上——收益多少、代价多少、数据说话、经验浓缩成十条建议,最后给出”什么情况下我们还会再选它”的判断标准。

三年数据回顾

先上”我们”的账本(四个项目的累计口径,数字量级真实,细节已模糊化):

指标起点(JHipster 6 时期)现在(JHipster 9.x)
项目数1(单体)4(1 微服务群 + 3 单体)
实体数38120+
服务数15(gateway + registry + 3 业务服务)
团队规模5 人22 人(3 个小组)
新人首次提交约 5 天平均 1.5 天
CI 全量时长22 分钟14 分钟(拆分后单服务 4-6 分钟)
发布频率双周每周多次,微服务独立发布
JHipster 大版本跨越6→7→8→9 三次,平均 8 人日/次
累计 blueprint01 个(17 个定制点,3 个项目共用)

最值的一行是”新人首次提交 1.5 天”:标准化的分层(第 1 篇)+ JDL 即文档(第 6 篇)+ 生成即测试(第 17 篇),新人不需要”懂这个项目的怪癖”,只需要懂 JHipster 的惯例——而 JHipster 的惯例有官方文档。

收益盘点

启动速度。 新项目从立项到可演示:早期手工时代约 4-6 周(含认证、权限、迁移、CI 的”补课”),现在 JDL 建模半天 + 生成当天出可部署骨架,第一周末就能给业务方点着看。四个项目里有两个是被”两周内要 demo”逼着立项的,没有生成器接不下。

规范统一。 22 人三个小组,四次 code review 培训就把分层、命名、异常处理的标准立住了——因为生成的代码就是范本。跨组借调零适应成本,这个收益随人数超线性。

升级能力。 第 22 篇展开过:事实源纪律让我们三次大版本跨越平均 8 人日,同期手工维护的另一个遗留系统升 Spring Boot major 花了两个月还没收尾。能持续升级意味着安全补丁跟得上、新人简历上的技能不过期——这两点在五年尺度上比任何单点技术优势都值钱。

安全的下限。 第 8、9 篇讲的认证授权体系由社区维护并持续加固(9.x 的 WebSocket security 一体化就是例子),我们的安全精力花在业务漏洞而不是基础设施漏洞上。第 29 篇那次弱 secret 事故,根因是我们自己违反纪律,不是生成器缺陷。

代价盘点

学习曲线。 JHipster 的概念面积不小:JDL、Liquibase、生成器工作流、profile 体系……新人”能提交”要一天,“理解为什么”要一个月。第 2-6 篇就是为这一个月写的教材。比手工项目多出的这部分学习,是预付的维护成本——三年账算下来是赚的,但预付是真的痛。

生成代码的边界感。 第 23 篇的哲学不是自带的,是坑 1 换来的。生成代码”看起来那么好改”是个陷阱,团队需要一段时间才能真正内化”可再生性”这个核心资产的概念。这个适应期大约两三个月,需要老人带。

版本跟进成本。 半年一个 major,跟不跟、怎么跟、什么时候跟(第 22 篇)每年都要花掉十几个工时做决策与执行,还有 blueprint 的对齐(第 24 篇)。这是”订阅制”成本,放弃升级就违约——长期维护的项目必须诚实计入。

社区是英文生态。 文档、issue、Stack Overflow 全英文,遇到问题的一手资料检索对语言有要求;国内社区资料少且滞后(第 1 篇对比过国内脚手架)。

技术栈漂移:三年间的调整

五年里技术栈不是静态的,我们在 JHipster 给的选项内做过几次调整,也拒绝过几次诱惑:

调整决策依据
缓存 ehcache → Redis第二年切微服务化后本地缓存失效不同步(第 10、26 篇)
认证 JWT → OAuth2/OIDC(对接公司 IdP)第三年切组织统一身份治理要求
前端 Angular 主线保持未动生成器主线支持最好,团队技能沉淀最深
部署 jar → 容器 → K8s渐进第 18、19 篇的两次搬家
GraalVM native仅网关/BFF 采用启动与内存收益明显,业务服务反射多收益有限(第 26 篇)
换 React/Vue 的诱惑拒绝迁移成本远大于收益,生成器三选一的价值在于别反复横跳

值得强调的是每次调整都在 JHipster 的选项空间内完成——重新生成或增量配置即可,没有被生成器”卡住”的感觉。这是选型时没想到的隐性收益:脚手架的选项面越宽,长期演进的自由度越大。

十条建议

三年经验压缩成十条,按重要性排序:

  1. 把 .yo-rc.json 与 .jhipster/ 当作生产数据对待——它们是”重建整个应用”的配方,入库、评审、备份(坑 2)。
  2. 第一天就建立”不改生成代码”的纪律,业务代码进自己的包/module/feature 目录(第 23 篇)。
  3. 单体起步,证据驱动地拆:部署频率、团队规模、故障隔离三个信号齐了再动(第 5、25 篇)。
  4. Liquibase changeset 不可变、大表 DDL 走并发、破坏性变更延后一版(第 7、28 篇,坑 4、5)。
  5. 敏感信息从第一天就走环境变量占位,等仓库火了再换就晚了(第 21 篇,坑 7)。
  6. 测试金字塔照生成的样子补全,升级时的底气全靠它(第 17 篇)。
  7. 升级小步多次:跨版本越多成本越超线性,每 12-18 个月跨一次 major 是节奏下限(第 22 篇)。
  8. i18n 的 key 约定和 locale 格式化纪律第一天定好,翻译债和手写格式化是两类最难还的债(第 27 篇)。
  9. 定制超过两个项目共用再做 blueprint,并预算每年 2-4 人日的跟版维护(第 24 篇)。
  10. 上线 checklist 当活文档养:每次事故复盘产出新的行(第 28、29 篇)。

什么时候我们还会再选它

再选的条件清单(也是不选的反面):

  • 企业内部管理系统、CRUD 密集、生命周期三年以上——闭眼选;
  • 多团队共享技术栈、需要强一致性——选,并把公司规范做成 blueprint;
  • 极致性能的 C 端、重算法/流处理、或团队完全无 Spring 基础——不选(第 1 篇的边界依然成立);
  • 生命周期一年以内的一次性项目——不选,模板收益来不及摊销学习成本;
  • 介于其间——先生成一个 spike 跑一周再定,生成成本本来就低,试错几乎免费。

如果重来:我们会改的三件事

复盘要诚实,有三件事如果带着现在的认知回到起点,我们会换做法:

第一,第一天就建立生成代码隔离纪律,而不是坑 1 之后。 第 23 篇的哲学我们是用四天升级冲突买的,但它本可以在第 1 周由老人立规零成本建立。技术纪律的引入成本随代码量线性增长,越晚越贵。

第二,更早做 JDL 集中维护。 早期实体全靠交互式问答生成,.jhipster/*.json 散乱且难以审阅,坑 2 和坑 12 都有它的影子。第二年起改为”JDL 单文件 + review 制”后,实体变更的评审质量明显提升——领域模型显式化后,架构师能在一个文件里看到全部实体与关系。

第三,微服务拆分可以再晚六个月。 第 25 篇说过我们第一版按技术分层切服务是错的;更深层的反思是:当时若把单体内模块化再夯实一阵(ArchUnit 边界、按域分表做到位),拆分窗口可以等团队对业务域的理解更成熟再开。拆分不可逆,模块化随时可退。

这三件事的共同教训:流程与纪律的前置投入,永远比技术本身的选择更影响长期成本。技术选错可以换,纪律缺位会在每个环节持续漏水。

常见质疑快答

向别的团队布道时常被问到的三个问题,答案也沉淀在这里:

“生成代码出了 bug 找谁?” 找社区。五年里生成代码本身的问题两只手数得过来,issue 区的响应通常以天计;而生成代码出 bug 的修复方式是”等下个版本重新生成”,比自研脚手架的”自己修”反而省力。真正的风险不在 bug,在你的手改把它变成孤儿代码(第 23 篇)。

“被生成器锁定(vendor lock-in)了怎么办?” JHipster 生成的是你的源代码,不是运行时依赖——“逃离”的成本就是普通 Spring Boot + Angular 项目的维护成本,天花板明确。真正的锁定发生在你大量手改生成文件之后,锁你的不是 JHipster,是自己的修改。

“AI 代码生成会不会取代它?” 我们内部也在用 AI 辅助编码,但两者解决的问题不同:AI 擅长局部代码,JHipster 擅长全局一致性——120 个实体同构分层、升级时整套模板同步演进,这是确定性生成器的领域。短期内我们看到的是互补:AI 写 biz 层,生成器管骨架。

全系列知识地图

30 篇的知识结构一张图收拢,四层递进:认知与基础 → 工程核心 → 架构演进 → 运维与收官。

flowchart TB
  subgraph L1["一:认知与基础(01-06)"]
    A1["01 为什么选"] --- A2["02 环境与首个应用"] --- A3["03 技术栈全景"]
    A3 --- A4["04 开发工作流"] --- A5["05 单体 vs 微服务"] --- A6["06 JDL 深入"]
  end
  subgraph L2["二:工程核心(07-17)"]
    B1["07 Liquibase"] --- B2["08-09 安全认证授权"] --- B3["10 缓存"]
    B3 --- B4["11 REST 设计"] --- B5["12 Kafka 异步"] --- B6["13-16 前端架构/安全/UI/表单"]
    B6 --- B7["17 测试"]
  end
  subgraph L3["三:交付与架构(18-25)"]
    C1["18 CI/CD"] --- C2["19 K8s"] --- C3["20 可观测性"]
    C3 --- C4["21 配置管理"] --- C5["22 升级策略"] --- C6["23 业务模块"]
    C6 --- C7["24 Blueprint"] --- C8["25 微服务拆分"]
  end
  subgraph L4["四:质量与收官(26-30)"]
    D1["26 性能调优"] --- D2["27 i18n"] --- D3["28 上线清单"]
    D3 --- D4["29 踩坑全集"] --- D5["30 复盘总结"]
  end
  L1 --> L2 --> L3 --> L4

如果只有时间读五篇:第 1(为什么)、第 6(JDL)、第 17(测试)、第 22(升级)、第 23(隔离哲学)——它们构成”正确使用 JHipster”的最小闭环。

按角色给阅读路径:新人按序读 01→06 即可上手;后端主力补 07-12 与 21-23;前端主力补 13-16 与 27;架构师重点 05、22、24、25、30;运维/SRE直接从 18-20、26、28、29 进入。知识地图的四层结构对应团队四种角色,这也是我们新人培训的实际分轨方案。

结语与致谢

三年前选 JHipster 是想省两周搭架子,三年后回头看,真正买到的是一套可以长期演进的工程秩序:事实源让重构可重演,纪律让升级可负担,清单让事故可预防。生成器终会过时(也许有一天 AI 直接生成整个应用),但这些工程原则会跟着我们到下一套技术栈。

感谢一路同行的团队——尤其坚持把 JDL 写完的 @yu、在凌晨的发布窗口里完善 checklist 的 @meng,以及在 review 里一次次打回”无标记改生成文件”的各位。也感谢 JHipster 社区与所有给这个系列提意见的读者,你们的 issue 和评论修正了这个系列的不少偏差。

系列至此完结。代码会继续跑,坑会继续踩,清单会继续长——这大概就是工程最真实的模样。若这篇复盘只留一句话给未来的自己,那就是第 1 篇标题的后半句:一次生成,十年维护;生成只是开始,维护才是全部。

系列导航

← Angular 22+ 教程 30:EventManagerPlugin 与手势事件 目录 算法 031:算法思想:分治算法 →
← 返回文章列表