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通信。 不知道为啥,Spring Cloud升级之后,排除了jersey依赖,HTTP通信貌似也没有通过RestTemplate来进行,启动会报jersey的包找不到: 之后解决方法就是手动添加了eureka-client依赖,解决问题:
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
</dependency>
ConfigServer配置拉取
升级之后,从configserver拉取配置时,会报如下错误,提示spring.config.import属性没有设置 根据官方文档,应该是Spring Boot 2.4.X版本之后提供了一个新的方式导入配置文件,和之前的配置方式不一样: 但是如果还是想用之前的方式,在bootstrap.yml文件中添加Spring Cloud Config服务的配置的话,需要添加spirng-cloud-starter-bootstrap这个依赖或者设置spring.cloud.bootstrap.enabled属性为true。 我这边采用的是添加spring-cloud-starter-bootstrap依赖的方式:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
zuul切换为gateway
其实主要的工作量都在zuul切换gateway这里,因为两边的实现区别很大,一个是基于servlet,一个是基于webflux。之前的博客也进行了总结。大致有如下几个方面。
过滤器
这个可以参考之前的博客,贴一下链接地址:
https://blog.csdn.net/qq_32238611/article/details/124356641
session共享
同样参考之前的博客,链接地址:
https://blog.csdn.net/qq_32238611/article/details/124654696
其他
其他就比如添加熔断,限流等等,网上也有很多类似的文档,大家也可以参考参考,之前整理的链接地址:
https://blog.csdn.net/qq_32238611/article/details/124461159
https://blog.csdn.net/qq_32238611/article/details/124995120
https://blog.csdn.net/qq_32238611/article/details/124743138
结语
以上就是我在进行软件升级时遇到的问题以及自己的解决方案,希望能够帮助到大家,为大家提供一些解决思路。
参考:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes
https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/#using-the-eurekaclient
https://stackoverflow.com/questions/67507452/no-spring-config-import-property-has-been-defined
https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_spring_cloud_config_client