记一次项目的SpringBoot升级过程
引言
由于项目安全方面的要求,需要对已有的一个项目进行依赖版本升级,作为一个纯纯的菜鸟,在升级过程中也遇到了许许多多的问题,因此记录一下此次升级过程中填过的坑,使用过的工具,也便能够为后续其他人在遇到相同经历的过程中提供一些思路。
原项目技术框架
项目采用SpringBoot+SpringCloud的微服务架构,SpringBoot版本为2.3.12.RELEASE,SpringCloud版本为Hoxton.SR10。采用Eureka作为服务的注册中心,采用Zuul作为微服务网关。涉及到的中间件主要有RabbitMq、Redis、Solr等。
由于2.3.12.RELEASE版本的SpringBoot存在漏洞问题,因此本次升级的主要目标就是升高SpringBoot版本。
具体升级过程
SpringBoot版本选择
具体存在漏洞问题的版本号可在 mvnrepository中查询,从是否存在漏洞可以先确认大致的版本范围,如2.5.12-2.5.14版本和2.6.6及以上版本。进入Spring官网中,也可以看到目前版本的推荐情况。
版本后常见的标记主要有GA、PRE和SNAPSHOT,其含义如下:
GA:General Availability,表示的是一般取得版本,即是经过SpringBoot官方确认发布的版本
PRE:Preview,尝鲜版,可以给开发人员使用,但不应该在生产环境中使用
SNAPSHOT:快照,属于一种定期发布,包含一些新特性,可能会持续有一些改进
由于SpringCloud与SpringBoot有明确的对应关系(官方查询链接),因此在升级SpringBoot版本的过程中,也需要对SpringCloud的版本进行升级。而目前官方推荐的SpringCloud版本如下所示:
点击具体版本后的Reference Doc.可查询到该版本的说明文档以及支持的SpringBoot版本。
查询到官方推荐的相关版本信息后,就可以初步确定升级的目标版本,我本次计划升级的版本是SpringCloud:2021.0.4、SpringBoot:2.6.11。确定好升级版本后,就是具体版本升级过程以及依赖冲突处理过程。
依赖冲突解决
对SpringBoot和SpringCloud进行版本升级后,首先要进行的就是要对依赖冲突进行处理,我主要是通过idea中的插件进行依赖冲突的查询,具体插件名称为:Maven Dependency Helper。安装完成后,打开pom.xml文件,在文件的下方即可看到Dependency Analyzer,点击后就可以看到某个冲突的依赖以及建议的版本。
专业版的idea还可以在pom.xml文件中直接右键,点击Diagrams–>Show Dependencies,以图的形式更直观看到各个依赖直接的关系,便于找到需要进行排除的依赖位置。
Eureka遇到的问题
升级版本后,首先是Eureka服务无法启动,报错内容主要为Failed to start bean ‘eurekaAutoServiceRegistration’; nested exception is java.lang.NullPointerException。经查引起的主要原因是所有服务都在引用同一个父依赖,在该父依赖中,spring-cloud-starter-netflix-eureka-client与spring-cloud-starter-netflix-eureka-serve是同时存在的,需要将其分开,在Eureka中仅引用spring-cloud-starter-netflix-eureka-serve,其他服务仅引用spring-cloud-starter-netflix-eureka-client。
其他可能的解决办法有:
Swagger无法访问问题
原项目中使用的是Swagger2,但由于Swagger2版本以及停更,SpringBoot版本也升级到了2.6.11,所以对Swagger也进行了升级,升级之后发现无法访问Swagger的页面。具体解决办法链接。此外,Swagger3版本的访问路径也发生了改变,具体如下:
// swagger2
http://{ip}:{port}/swagger-ui.html
// swagger3
http://{ip}:{port}/swagger-ui/index.html
Gateway问题
Gateway遇到的问题是此次升级过程中最大的问题,曾一度觉得要重写gateway,还好最终找到了解决办法。
-
无法启动问题
首先是无法启动问题,该问题的引起主要是因为负载均衡器Ribbon的弃用。在新的SpringCloud版本中Ribbon已经完全被弃用,取而代之的是spring-cloud-loadbalancer。因此需要在依赖中添加spring-cloud-loadbalancer,从而解决启动问题。 -
无法发现注册的服务
原项目采用zuul作为微服务网关,而在启动后访问的过程中,zuul模块报错找不到注册在Eureka中对应的客户端(com.netflix.zuul.exception.ZuulException: Forwarding error),网上搜索到很多相关信息(如参考1、参考2等),多次尝试无效后发现最终还是和SpringCloud版本有关。SpringCloud新版本中已经在Netfix包中去掉了zuul,官方默认采用的微服务网关为spring-cloud-gateway。因此首先需要在项目中添加zuul依赖,即spring-cloud-starter-netflix-zuul。且zuul与eureka直接需要通过ribbon进行连接,而ribbon也已经被新版本的SpringCloud弃用,因此还需要添加ribbon-eureka依赖。
依赖添加完成后,发现还是无法对Eureka中注册的服务进行访问,此时可以通过注解的方式从Eureka中拉取注册的服务。具体参考链接。配置完成后,再次启动项目后就可以正常使用了,此外也可以在Ribbon官方链接中查看更多参数配置方法。
其他问题
-
跨域配置问题
报错内容:java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value “*”此问题为SpringBoot升级后,跨域配置中的.allowedOrigins不再可用。
解决方案:将代码里的allowedOrigins替换为allowedOriginPatterns(参考链接)
总结
版本升级过程中遇到的问题究其原因大多都是由于高版本对一些方法或者模块的弃用或者更改,所以在升级过程中,当遇到问题时首先应该思考的方向就是是否是由于高版本的不支持造成的。