🚩 方式一:分支并行升级
- 在 Git 建立 upgrade-java17 分支。
- 改 pom.xml,换 JVM,升级依赖。
- 用 SonarQube/SpotBugs 全面扫一次代码,修复反射、SPI 等老旧实现。
- 跑单测,逐步跑集成测试(接口、支付、库存、发货、消息队列)。
- 找非核心接口灰度上线一部分流量验证。
🚩 方式二:分模块切换
- 如果是模块化商城(用户中心、支付中心、商品中心、订单中心),可以先把非核心的边缘服务先换 JVM。
- 保证核心服务先别动,逐步上线。
🚩 常见灰度坑
- 分布式 Session、序列化(Kryo、Jackson)要兼容老版本客户端。
- 消息队列(Kafka/RabbitMQ)中序列化数据格式要保证向后兼容。
🧰 5️⃣ 检查与调优
✅ JVM 参数:
- -XX:+UseG1GC(默认)
- 如果需要低延迟: bash复制编辑-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
✅ 监控:
- JFR(Java Flight Recorder)在 Java 11+ 更好用了,替换老的 jstat、jvisualvm。
- 加强 Prometheus + Grafana 的 JVM 指标采集。
✅ 性能回归:
- 吞吐、延迟、内存泄漏测试要做完整压测对比。
- 特别是支付、订单流要覆盖并发高峰场景。