Spring Boot、Spring Cloud升级踩坑汇总

背景

最近在进行Spring Boot、Spring Cloud的升级,是跨大版本升级,遇到了一些适配的问题,本文主要整理了升级中遇到的问题以及自己的解决思路,希望能够帮助到大家。

升级版本如下:

Spring Boot 2.3.12.REALEASE -> 2.6.7

Spring Cloud Hoxton.SR12 -> 2021.0.2

修改点汇总

根据我们产品使用的功能,大概有如下几个修改点。

循环依赖问题

Spring Boot 2.6.X版本之后默认是不允许产生循环依赖,如果代码中存在循环依赖会直接启动失败。这边需要通过设置spring.main.allow-circular-references属性为true允许循环依赖。

spring:
  main:
    allow-circular-references: true # 允许循环依赖

eureka注册问题

升级Spring Cloud到2021.0.2版本之后,eureka依赖中默认把jersey去掉了,导致注册到eureka失败,但是根据官方文档中的描述,应该默认使用RestTemplate来进行HTTP通信。

springboot gradle jackson升级 spring boot升级spring cloud_bootstrap


不知道为啥,Spring Cloud升级之后,排除了jersey依赖,HTTP通信貌似也没有通过RestTemplate来进行,启动会报jersey的包找不到:

springboot gradle jackson升级 spring boot升级spring cloud_spring boot_02


之后解决方法就是手动添加了eureka-client依赖,解决问题:

<dependency>
  <groupId>com.netflix.eureka</groupId>
  <artifactId>eureka-client</artifactId>
</dependency>

ConfigServer配置拉取

升级之后,从configserver拉取配置时,会报如下错误,提示spring.config.import属性没有设置

springboot gradle jackson升级 spring boot升级spring cloud_spring boot_03


根据官方文档,应该是Spring Boot 2.4.X版本之后提供了一个新的方式导入配置文件,和之前的配置方式不一样:

springboot gradle jackson升级 spring boot升级spring cloud_Cloud_04


但是如果还是想用之前的方式,在bootstrap.yml文件中添加Spring Cloud Config服务的配置的话,需要添加spirng-cloud-starter-bootstrap这个依赖或者设置spring.cloud.bootstrap.enabled属性为true。

springboot gradle jackson升级 spring boot升级spring cloud_spring cloud_05


我这边采用的是添加spring-cloud-starter-bootstrap依赖的方式:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

zuul切换为gateway

其实主要的工作量都在zuul切换gateway这里,因为两边的实现区别很大,一个是基于servlet,一个是基于webflux。之前的博客也进行了总结。大致有如下几个方面。

过滤器

这个可以参考之前的博客,贴一下链接地址:


session共享

同样参考之前的博客,链接地址:


其他

其他就比如添加熔断,限流等等,网上也有很多类似的文档,大家也可以参考参考,之前整理的链接地址:




结语

以上就是我在进行软件升级时遇到的问题以及自己的解决方案,希望能够帮助到大家,为大家提供一些解决思路。