1. 版本对应关系为什么总让人踩坑
做过微服务架构的同学大概率都经历过这种场景:项目跑得好好的,某天想升级一个组件,结果启动直接报NoSuchMethodError,或者 Nacos 注册不上、Sentinel 规则不生效、Gateway 路由 404。排查半天,最后发现是 Spring Cloud Alibaba、Spring Cloud、Spring Boot 三者版本没对齐。这不是代码写得有问题,而是版本矩阵没搞明白。
Spring Cloud Alibaba 并不是一个孤立框架,它站在 Spring Cloud 和 Spring Boot 的肩膀上。Spring Boot 提供自动装配和基础容器能力,Spring Cloud 提供微服务抽象层(比如服务发现、配置中心、负载均衡的接口规范),而 Spring Cloud Alibaba 则是这些规范的具体实现,把 Nacos、Sentinel、Seata、RocketMQ 等阿里系中间件整合进来。三者之间是层层依赖的关系,任何一层版本错位,都会导致自动装配失败或者运行时行为异常。
这篇文章面向的是正在使用或准备使用 Spring Cloud Alibaba 做微服务开发的工程师,不管你是在搭建新项目还是在维护老系统,版本选型这件事都绕不过去。我会把版本对应关系的底层逻辑、官方推荐矩阵、实际选型方法、升级踩坑经验全部拆开讲清楚,让你看完就能直接对照自己的项目做决策,不用再去翻一堆互相矛盾的博客。
2. 三者到底是什么关系
2.1 从依赖层次理解版本传递
先把这个关系理清楚,不然后面看版本号就是一团乱麻。
Spring Boot 是最底层的基础设施,它管的是内嵌容器、自动配置机制、Starter 依赖管理这些东西。你写的每个微服务应用,最终都是一个 Spring Boot 应用。
Spring Cloud 建立在 Spring Boot 之上,它定义了一套微服务的抽象规范和一套 Starter。比如spring-cloud-starter-loadbalancer提供客户端负载均衡能力,spring-cloud-starter-gateway提供网关能力。但 Spring Cloud 本身不实现具体的注册中心或配置中心,它只定义接口。
Spring Cloud Alibaba 则是 Spring Cloud 生态中的一个具体实现方案。它把 Nacos 作为注册中心和配置中心,把 Sentinel 作为流量防护组件,把 Seata 作为分布式事务解决方案,把 RocketMQ 作为消息中间件。这些组件通过 Spring Cloud 的标准接口接入,所以你的业务代码不需要直接依赖 Alibaba 的实现类,面向接口编程即可。
关键点:Spring Cloud Alibaba 的版本号并不是独立演进的,它必须绑定一个特定的 Spring Cloud 版本,而那个 Spring Cloud 版本又必须绑定一个特定的 Spring Boot 版本。这是一条单向的依赖链。
2.2 版本号命名规则解读
Spring Boot 的版本号格式是主版本.次版本.补丁版本,比如2.7.18、3.2.5。从 2.x 到 3.x 是一次大版本跃迁,最大的变化是 JDK 基线从 JDK 8 提升到了 JDK 17,同时 Jakarta EE 取代了 Java EE,包名从javax.*变成了jakarta.*。这个变化影响巨大,很多老项目升级到 Spring Boot 3.x 时,所有涉及 Servlet、Validation、Persistence 的 import 都要改。
Spring Cloud 的版本号用的是伦敦地铁站名字,比如Hoxton、2020.0、2021.0、2022.0、2023.0。从 2020.0 开始,Spring Cloud 改用了日历化版本号,格式是YYYY.MINOR.PATCH。每个 Spring Cloud 版本对应一个 Spring Boot 版本范围,比如2022.0.x对应 Spring Boot3.0.x,2021.0.x对应 Spring Boot2.6.x和2.7.x。
Spring Cloud Alibaba 的版本号格式是主版本.次版本.补丁版本,比如2.2.9.RELEASE、2021.0.5.0、2022.0.0.0。注意从2021.0.1.0开始,Spring Cloud Alibaba 也改用了和 Spring Cloud 对齐的日历化版本号。版本号的前三段通常和对应的 Spring Cloud 版本一致,最后一段是 Alibaba 自己的补丁号。
2.3 为什么版本错位会出问题
版本错位导致的问题大致分三类。
第一类是编译期或启动期直接报错。比如你用了 Spring Cloud Alibaba2021.0.5.0,但它依赖的 Spring Cloud 是2021.0.5,而你项目里手动指定了 Spring Cloud2022.0.0,这时候spring-cloud-starter-bootstrap可能已经被移除或重构,启动时直接抛ClassNotFoundException。
第二类是运行时行为异常。比如 Nacos 客户端版本和 Nacos 服务端版本差距过大,服务能注册上去但心跳检测失败,导致服务列表里出现幽灵实例。或者 Sentinel 的规则推送格式变了,控制台推的规则客户端解析不了,限流形同虚设。
第三类是最难排查的,就是功能静默失效。比如 Gateway 的路由配置加载了但没生效,或者 OpenFeign 的负载均衡策略没按预期工作。这类问题不会报错,但业务行为不符合预期,排查起来非常耗时。
3. 官方版本对应矩阵全解析
3.1 Spring Boot 2.x 时代的版本对应
Spring Boot 2.x 是目前存量项目最多的版本线,很多公司还在用 JDK 8,短期内不会升级到 3.x。这条线的版本对应关系相对成熟稳定。
| Spring Cloud Alibaba | Spring Cloud | Spring Boot | Spring Cloud Alibaba 组件版本 |
|---|---|---|---|
| 2.2.10.RELEASE | Hoxton.SR12 | 2.3.12.RELEASE | Nacos 2.2.0, Sentinel 1.8.6, Seata 1.7.0 |
| 2.2.9.RELEASE | Hoxton.SR12 | 2.3.12.RELEASE | Nacos 2.1.0, Sentinel 1.8.5, Seata 1.5.2 |
| 2.2.8.RELEASE | Hoxton.SR12 | 2.3.12.RELEASE | Nacos 2.1.0, Sentinel 1.8.4, Seata 1.4.2 |
| 2.2.7.RELEASE | Hoxton.SR12 | 2.3.12.RELEASE | Nacos 2.0.4, Sentinel 1.8.3, Seata 1.4.2 |
| 2.2.6.RELEASE | Hoxton.SR9 | 2.3.2.RELEASE | Nacos 1.4.2, Sentinel 1.8.1, Seata 1.4.2 |
| 2.2.5.RELEASE | Hoxton.SR8 | 2.3.2.RELEASE | Nacos 1.4.1, Sentinel 1.8.0, Seata 1.3.0 |
| 2.2.3.RELEASE | Hoxton.SR8 | 2.3.2.RELEASE | Nacos 1.4.0, Sentinel 1.8.0, Seata 1.3.0 |
| 2.2.1.RELEASE | Hoxton.SR3 | 2.2.5.RELEASE | Nacos 1.2.1, Sentinel 1.7.1, Seata 1.1.0 |
| 2.1.0.RELEASE | Greenwich.SR2 | 2.1.6.RELEASE | Nacos 1.1.1, Sentinel 1.6.3, Seata 0.9.0 |
这张表里最值得关注的是2.2.10.RELEASE,它是 Spring Boot 2.x 线的最后一个版本,也是目前最推荐的 2.x 稳定版本。如果你现在维护的是 JDK 8 项目,直接选这个版本组合就行。
注意:Spring Cloud Alibaba
2.2.x系列对应的 Spring Cloud 版本都是 Hoxton,但 Hoxton 本身有多个 SR(Service Release)版本。官方推荐用 Hoxton.SR12,这是 Hoxton 线的最终版本,修复了之前多个安全漏洞。
3.2 Spring Boot 3.x 时代的版本对应
Spring Boot 3.x 是未来的主流方向,JDK 基线是 17,支持到 JDK 21。这条线的版本对应关系更新更频繁,需要特别留意。
| Spring Cloud Alibaba | Spring Cloud | Spring Boot | Spring Cloud Alibaba 组件版本 |
|---|---|---|---|
| 2023.0.1.0 | 2023.0.1 | 3.2.4 | Nacos 2.3.2, Sentinel 1.8.7, Seata 2.0.0 |
| 2023.0.0.0 | 2023.0.0 | 3.2.0 | Nacos 2.3.0, Sentinel 1.8.6, Seata 2.0.0 |
| 2022.0.0.0 | 2022.0.0 | 3.0.0 | Nacos 2.2.1, Sentinel 1.8.6, Seata 1.7.0 |
| 2021.0.6.0 | 2021.0.6 | 2.7.15 | Nacos 2.2.3, Sentinel 1.8.6, Seata 1.7.0 |
| 2021.0.5.0 | 2021.0.5 | 2.7.13 | Nacos 2.2.1, Sentinel 1.8.6, Seata 1.7.0 |
| 2021.0.4.0 | 2021.0.4 | 2.6.13 | Nacos 2.2.1, Sentinel 1.8.5, Seata 1.6.1 |
| 2021.0.1.0 | 2021.0.1 | 2.6.3 | Nacos 2.0.4, Sentinel 1.8.3, Seata 1.4.2 |
这里有个容易混淆的地方:2021.0.x.x系列虽然版本号看起来像 Spring Cloud 2021.0.x,但它对应的 Spring Boot 版本是 2.6.x 和 2.7.x,不是 3.x。真正对应 Spring Boot 3.x 的是2022.0.0.0和2023.0.x.x。
实操建议:如果你的项目已经升级到 JDK 17 并且想用 Spring Boot 3.x,优先选
2023.0.1.0这个组合。它对应的 Spring Boot 3.2.4 是 3.2.x 线的稳定版本,Nacos 客户端也升级到了 2.3.2,对 Nacos 2.x 服务端的兼容性更好。
3.3 版本对应关系的底层逻辑
为什么版本对应关系是这样的?这要从 Maven 的依赖传递机制说起。
当你在pom.xml里引入spring-cloud-alibaba-dependencies这个 BOM(Bill of Materials)时,它内部已经声明了对应版本的 Spring Cloud 和 Spring Boot 依赖。比如spring-cloud-alibaba-dependencies:2023.0.1.0的 POM 文件里,会通过dependencyManagement锁定 Spring Cloud2023.0.1和 Spring Boot3.2.4的版本。
但这里有个陷阱:如果你在项目里同时引入了spring-boot-dependencies和spring-cloud-alibaba-dependencies两个 BOM,Maven 的依赖调解机制会按照“最近优先”原则选择版本。如果两个 BOM 声明的 Spring Boot 版本不一致,最终生效的是先声明的那个。这就是为什么有时候你明明改了 Alibaba 版本,但 Spring Boot 版本没跟着变。
正确的做法是:在dependencyManagement里只引入spring-boot-dependencies和spring-cloud-alibaba-dependencies,让 Alibaba 的 BOM 去管理 Spring Cloud 的版本。不要手动指定 Spring Cloud 的版本号,除非你明确知道自己在做什么。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.2.4</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2023.0.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>这段配置里,spring-boot-dependencies的版本必须和spring-cloud-alibaba-dependencies内部声明的 Spring Boot 版本一致。如果你写的是3.2.4,但 Alibaba BOM 内部声明的是3.2.0,Maven 会以你显式声明的3.2.4为准,这通常没问题,但可能引入未测试过的组合。最稳妥的方式是查一下 Alibaba BOM 的 POM 文件,看看它声明的 Spring Boot 版本是多少,然后保持一致。
4. 版本选型的实操方法
4.1 新项目怎么选版本
新项目选版本,核心原则是:选稳定版,不选最新版;选官方推荐组合,不选自己拼凑的组合。
第一步,确定 JDK 版本。如果团队和运维环境还在 JDK 8,那就锁定 Spring Boot 2.x 线,直接选 Spring Cloud Alibaba2.2.10.RELEASE+ Spring CloudHoxton.SR12+ Spring Boot2.3.12.RELEASE。这个组合经过了大量生产验证,社区资料也最丰富。
如果 JDK 是 17 或 21,那就选 Spring Boot 3.x 线。目前推荐 Spring Cloud Alibaba2023.0.1.0+ Spring Cloud2023.0.1+ Spring Boot3.2.4。这个组合的组件版本比较新,Nacos 客户端 2.3.2 对 Nacos 服务端 2.x 的支持更完善。
第二步,确认中间件版本。Nacos 服务端如果是 2.x,客户端最好也用 2.x,避免用 1.x 客户端连 2.x 服务端。Sentinel 控制台版本要和客户端版本匹配,Seata 服务端和客户端版本也要一致。这些中间件的版本在 Spring Cloud Alibaba 的 BOM 里已经锁定了,你只需要确认服务端部署的版本和 BOM 里的版本差距不要太大。
第三步,验证依赖树。在项目根目录执行mvn dependency:tree,检查 Spring Boot、Spring Cloud、Spring Cloud Alibaba 的实际版本是否和预期一致。重点看有没有其他依赖引入了不同版本的 Spring Boot 或 Spring Cloud。
mvn dependency:tree -Dincludes=org.springframework.boot:spring-boot mvn dependency:tree -Dincludes=org.springframework.cloud:spring-cloud-* mvn dependency:tree -Dincludes=com.alibaba.cloud:spring-cloud-alibaba-*这三条命令分别查看 Spring Boot、Spring Cloud、Spring Cloud Alibaba 的实际依赖版本。如果发现版本和预期不一致,往上追溯是哪个依赖引入的,然后用exclusion排除掉。
4.2 老项目升级怎么选版本
老项目升级比新项目选版本复杂得多,因为要考虑兼容性。升级路径一般有两种:小版本升级和大版本升级。
小版本升级比如从 Spring Cloud Alibaba2.2.6.RELEASE升到2.2.10.RELEASE,Spring Boot 从2.3.2.RELEASE升到2.3.12.RELEASE。这种升级风险较低,主要是修 bug 和安全补丁,API 基本不变。升级时重点检查 Nacos 客户端版本变化带来的配置项变更,比如 Nacos 2.x 客户端新增了 gRPC 通信端口,如果服务端没开放对应端口,会连接失败。
大版本升级比如从 Spring Boot 2.x 升到 3.x,这是伤筋动骨的改动。除了版本号变化,还要处理javax.*到jakarta.*的包名替换、Spring Security 配置方式变更、Spring Cloud 部分组件移除等问题。升级前一定要做完整的回归测试,不能只看编译通过就上线。
实操心得:大版本升级时,建议先升级 Spring Boot,再升级 Spring Cloud,最后升级 Spring Cloud Alibaba。每升一步都跑一遍集成测试,确认没问题再升下一步。不要三个一起升,出了问题很难定位是哪个环节导致的。
4.3 版本冲突的排查方法
版本冲突最典型的症状是NoSuchMethodError、ClassNotFoundException、NoClassDefFoundError。遇到这类错误,第一步就是看依赖树。
mvn dependency:tree -Dverbose > dependency-tree.txt把依赖树输出到文件,然后搜索报错的类名,看看这个类是从哪个 jar 包加载的,版本是多少。如果发现同一个类出现在多个 jar 包里,那就是版本冲突了。
另一种排查方式是用mvn dependency:analyze分析依赖使用情况,找出被声明但未使用的依赖,以及被使用但未声明的依赖。这有助于清理掉不必要的依赖,减少冲突概率。
如果依赖树太复杂,可以用 IDE 的 Maven 插件可视化查看。IntelliJ IDEA 的 Maven 面板里有一个“Show Dependencies”按钮,能生成依赖关系图,冲突的依赖会用红色标注,一目了然。
5. 升级过程中的典型问题与解决
5.1 Nacos 客户端与服务端版本不匹配
Nacos 1.x 和 2.x 的通信协议不同。1.x 用的是 HTTP 短连接,2.x 引入了 gRPC 长连接。如果客户端是 1.x,服务端是 2.x,通常还能兼容,因为 Nacos 2.x 服务端同时支持 HTTP 和 gRPC。但如果客户端是 2.x,服务端是 1.x,就会出问题,因为 1.x 服务端不支持 gRPC。
排查方法:看客户端启动日志里有没有grpc相关的报错,或者用telnet测试 Nacos 服务端的 9848 端口(gRPC 端口)是否开放。如果没开放,要么升级服务端到 2.x,要么把客户端降级到 1.x。
注意:Nacos 2.x 服务端默认开启 gRPC 端口,主端口是 8848,gRPC 端口是主端口加 1000,即 9848。如果服务端部署在容器里,要确保 9848 端口也映射出来了。
5.2 Sentinel 规则不生效
Sentinel 规则不生效的常见原因是客户端版本和控制台版本不匹配。Sentinel 控制台推送规则用的是特定的数据格式,如果客户端版本太老,解析不了新格式的规则,就会静默忽略。
排查方法:看客户端日志里有没有Sentinel相关的警告,或者在 Sentinel 控制台看机器列表里有没有你的应用实例。如果实例在线但规则不生效,大概率是版本问题。解决办法是让客户端版本和控制台版本保持一致,或者至少保证客户端版本不低于控制台版本。
另一个常见原因是规则推送模式配置错了。Sentinel 支持三种规则推送模式:原始模式、Pull 模式和 Push 模式。如果用的是 Push 模式但没配置 Nacos 或 Apollo 作为配置源,规则推不过去。检查application.yml里有没有配置spring.cloud.sentinel.datasource相关的内容。
5.3 Gateway 路由配置加载失败
Spring Cloud Gateway 在 Spring Boot 3.x 里有一些配置项变更。比如spring.cloud.gateway.discovery.locator.enabled这个配置在 2022.0.0 之后的版本里行为有变化,默认值从false变成了true,导致一些原本手动配置的路由被自动生成的路由覆盖。
排查方法:启动时加--debug参数,看 Gateway 自动配置的日志,确认加载了哪些路由。如果发现路由不符合预期,检查配置文件里的路由定义和自动发现配置有没有冲突。
实操心得:Gateway 的路由配置建议全部用代码方式定义(
RouteLocatorBean),不要用 YAML 配置。代码方式更灵活,也更容易排查问题。YAML 配置在版本升级时容易因为配置项变更而失效,而且没有编译期检查。
5.4 Seata 事务不生效
Seata 在 Spring Boot 3.x 里需要额外注意 JDK 17 的模块化限制。Seata 的一些反射操作在 JDK 17 下会报InaccessibleObjectException,需要在启动参数里加--add-opens来开放模块访问权限。
java --add-opens java.base/java.lang=ALL-UNNAMED \ --add-opens java.base/java.lang.reflect=ALL-UNNAMED \ -jar your-application.jar另外,Seata 的undo_log表结构在不同版本间可能有变化,升级 Seata 版本时要同步更新数据库表结构。建议在测试环境先跑一遍,确认事务回滚正常再上生产。
6. 版本管理的长期策略
6.1 用 BOM 统一管理版本
BOM 是 Maven 提供的一种依赖版本管理机制。引入 BOM 后,你在声明依赖时不需要写版本号,Maven 会自动从 BOM 里读取。这样能保证所有依赖的版本一致,避免手动指定版本导致的冲突。
Spring Cloud Alibaba 的 BOM 坐标是com.alibaba.cloud:spring-cloud-alibaba-dependencies。引入方式前面已经演示过了,这里不再重复。关键是要确保 BOM 的版本和 Spring Boot 的版本匹配,不要混用不同版本的 BOM。
注意:BOM 只管理版本,不引入实际依赖。你还需要在
dependencies里声明具体要用哪些 Starter,比如spring-cloud-starter-alibaba-nacos-discovery、spring-cloud-starter-alibaba-sentinel等。
6.2 定期检查依赖更新
依赖版本不是选好就一劳永逸的,需要定期检查更新。Maven 有一个versions插件可以帮你做这件事。
mvn versions:display-dependency-updates mvn versions:display-plugin-updates这两条命令分别检查依赖和插件的可用更新。输出结果里会列出当前版本和最新版本,你可以根据实际情况决定是否升级。但不要盲目升级到最新版,尤其是大版本升级,一定要先看 Release Notes,确认没有破坏性变更。
6.3 建立版本升级的检查清单
每次升级版本时,按以下清单逐项检查,能避免大部分低级错误:
- 确认 JDK 版本是否满足新版本要求
- 确认 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者版本是否匹配
- 确认中间件(Nacos、Sentinel、Seata、RocketMQ)服务端版本是否兼容
- 检查
pom.xml里有没有手动指定版本号的地方,有的话改成由 BOM 管理 - 执行
mvn dependency:tree确认实际依赖版本 - 跑一遍单元测试和集成测试
- 在测试环境部署验证,重点测服务注册、配置加载、限流规则、分布式事务
- 检查启动日志里有没有版本相关的警告或错误
这套流程看起来繁琐,但比起上线后出问题再回滚,前期多花半小时检查是值得的。我见过太多团队因为跳过测试直接上线,结果半夜被叫起来处理故障。
6.4 版本锁定与灰度升级
生产环境升级版本时,建议采用灰度策略。先升级一个非核心服务,观察一段时间(至少一周),确认没问题后再逐步扩大范围。不要一次性全量升级,否则出问题时影响面太大。
版本锁定方面,建议在pom.xml里用<spring-boot.version>、<spring-cloud.version>、<spring-cloud-alibaba.version>三个属性统一管理版本号,方便后续修改。同时把这些版本号记录到项目的 README 或 Wiki 里,让团队成员都能查到当前使用的版本组合。
<properties> <spring-boot.version>3.2.4</spring-boot.version> <spring-cloud.version>2023.0.1</spring-cloud.version> <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version> </properties>这样配置的好处是,升级时只需要改这三个属性值,所有依赖的版本会自动跟着变。但前提是 BOM 里已经声明了这些依赖的版本,否则改了属性也不会生效。
7. 几个容易被忽略的细节
7.1 Spring Cloud Alibaba 的孵化器版本
Spring Cloud Alibaba 除了正式版本,还有一些孵化器版本,版本号里带RC或SNAPSHOT。这些版本不建议在生产环境使用,因为 API 可能随时变化,而且没有经过充分测试。选版本时优先选RELEASE结尾的正式版。
7.2 Spring Cloud 的兼容性检查器
Spring Cloud 提供了一个兼容性检查器,可以在启动时验证 Spring Boot 和 Spring Cloud 的版本是否匹配。引入spring-cloud-starter后,启动时会自动检查,如果不匹配会打印警告日志。不要忽略这些警告,它们往往预示着潜在问题。
7.3 不同 Starter 的版本差异
Spring Cloud Alibaba 下的各个 Starter(Nacos、Sentinel、Seata、RocketMQ)版本是独立演进的,虽然 BOM 里锁定了推荐版本,但你可以单独覆盖某个 Starter 的版本。比如你想用更新版本的 Nacos 客户端,可以在dependencies里显式声明版本号。但这样做有风险,可能引入不兼容的 API 变更,建议只在明确知道后果的情况下操作。
7.4 配置文件的版本适配
不同版本的 Spring Cloud Alibaba 对配置项的支持不同。比如 Nacos 配置中心的spring.cloud.nacos.config.file-extension配置项在 2.2.x 之后才支持yaml格式,之前的版本只支持properties。升级版本时,要检查配置文件里的配置项是否还受支持,不支持的配置项会被静默忽略,导致功能不符合预期。
实操心得:升级版本后,把
application.yml里的所有配置项对照官方文档过一遍,确认没有废弃的配置项。特别是spring.cloud.nacos、spring.cloud.sentinel、spring.cloud.gateway这几个前缀下的配置,版本间变化比较频繁。
7.5 日志级别的调整
排查版本问题时,把相关包的日志级别调到DEBUG能看到更多信息。比如排查 Nacos 注册问题时,设置logging.level.com.alibaba.nacos=DEBUG,能看到客户端和服务端的完整通信过程。排查 Sentinel 问题时,设置logging.level.com.alibaba.csp.sentinel=DEBUG,能看到规则加载和匹配的详细日志。
但要注意,DEBUG级别日志量很大,只在排查问题时临时开启,问题解决后记得调回INFO,否则会影响生产环境的磁盘空间和性能。
8. 我个人的版本管理体会
做了这么多微服务项目,版本管理这件事给我的最大教训就是:不要贪新,不要自己拼版本。官方推荐的版本组合是经过大量测试的,虽然可能不是最新的,但一定是最稳的。自己拼版本看起来能用到最新特性,但踩坑的概率成倍增加。
另一个体会是,版本升级一定要有回滚方案。升级前把当前版本的pom.xml备份一份,数据库做一次全量备份,容器镜像保留旧版本。万一升级后出问题,能快速回滚到之前的稳定状态。我见过太多团队升级时没做备份,出问题后回滚不了,只能硬着头皮往前修,结果越修问题越多。
最后分享一个小技巧:在项目的pom.xml里加一个spring-boot-maven-plugin的build-infogoal,每次打包时自动生成版本信息文件。这样在应用启动时可以通过/actuator/info端点查看当前运行的版本组合,排查问题时不用去翻pom.xml,直接看接口返回就行。
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>build-info</goal> </goals> </execution> </executions> </plugin>配置好后,访问http://localhost:8080/actuator/info就能看到版本信息。这个信息在排查线上问题时特别有用,能快速确认当前运行的版本是否符合预期。