0


Spring Boot 3.x微服务升级经历

前言

Spring Boot 3.0.0 GA版已经发布,好多人也开始尝试升级,有人测试升级后,启动速度确实快了不少,如下为网络截图,于是我也按捺不住的想尝试下。
在这里插入图片描述

历程

首先就是要把Spring Boot、Spring Cloud 相关的依赖升一下
Spring Boot:3.0.0
Spring Cloud:2022.0.0-RC2

统一依赖版本管理:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2022.0.0-RC2</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

现在还不能下载Spring 相关依赖包,需要加入Spring 仓库。
在你的maven仓库中加入如下配置,我是加在了

pom.xml

<repository><id>netflix-candidates</id><name>Netflix Candidates</name><url>https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository>

另外Spring Boot 3.X 开始使用了Java 17,将java版本调整到>17,为了不必要的麻烦,就选17

IDEA选择17,并在pom.xml文件中指定版本:
<java.version>17</java.version>

到这里我们的common 包是能正常编译了。

接下来是服务的配置
同样调整Spring Boot、Spring Cloud、Java的版本,同common的配置。
碰到如下的几个问题:

找不到hystrix的依赖问题


升级后找不到hystrix的版本,官网也找不到,这里我显式指定了版本

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.9.RELEASE</version></dependency>
rabbitmq问题


相关的配置丢失,比如如下图,这边进行适当调整或者直接注释解决。
在这里插入图片描述
在这里插入图片描述

TypeVariableImpl丢失问题


原来服务中引入了

sun.reflect.generics.reflectiveObjects.TypeVariableImpl

,现在17中已经被隐藏无法直接使用,这边为了能够先启动,暂时注释,后面再想办法。

Log 异常问题


由于之前我们项目中历史原因,既有用

log4j

,也有用

logback

,升级后已经不行,提示冲突,报错如下

Exception in thread "main"java.lang.IllegalArgumentException:LoggerFactory is not a LogbackLoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (classorg.slf4j.helpers.NOPLoggerFactory loaded from file:/Users/chenjujun/.m2/repository/org/slf4j/slf4j-api/1.7.0/slf4j-api-1.7.0.jar).If you are using WebLogic you will need toadd 'org.slf4j' toprefer-application-packages in WEB-INF/weblogic.xml:org.slf4j.helpers.NOPLoggerFactory
    at org.springframework.util.Assert.instanceCheckFailed(Assert.java:713)
    at org.springframework.util.Assert.isInstanceOf(Assert.java:632)

意思是,要么移除Logback,要么解决slf4j-api的冲突依赖,这里两种方式都尝试了,slf4j-api依赖的地方太多,后面移除了Logback。

要排除依赖一个好办法:使用

Maven Helper

插件

在这里插入图片描述

logback依赖:

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.8</version></dependency>
Apollo问题


使用Apollo会提示该错误,需要在启动中加入

--add-opens java.base/java.lang=ALL-UNNAMED
Caused by:com.ctrip.framework.apollo.exceptions.ApolloConfigException:Unabletoload instance forcom.ctrip.framework.apollo.spring.config.ConfigPropertySourceFactory!
    at com.ctrip.framework.apollo.spring.util.SpringInjector.getInstance(SpringInjector.java:40)
    at com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer.<init>(ApolloApplicationContextInitializer.java:66)...16 more
Caused by:com.ctrip.framework.apollo.exceptions.ApolloConfigException:UnabletoinitializeApolloSpringInjector!
    at com.ctrip.framework.apollo.spring.util.SpringInjector.getInjector(SpringInjector.java:24)
    at com.ctrip.framework.apollo.spring.util.SpringInjector.getInstance(SpringInjector.java:37)...17 more
Caused by:java.lang.reflect.InaccessibleObjectException:Unabletomakeprotectedfinaljava.lang.Classjava.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)throwsjava.lang.ClassFormatError accessible:modulejava.base does not "opens java.lang"tounnamedmodule@16612a51
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
    at com.google.inject.internal.cglib.core.$ReflectUtils$1.run(ReflectUtils.java:52)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
    at com.google.inject.internal.cglib.core.$ReflectUtils.<clinit>(ReflectUtils.java:42)

通过上述配置调整后,能编译成功,但是无法启动,控制没有任何日志,初步怀疑还是log依赖问题,由于时间关系,没有再继续,问题留到以后再弄,后面有新进展,会持续更新该文。

在这里插入图片描述

作者其他文章:
Grafana 系列文章,版本:OOS v9.3.1(更新中)

  1. Grafana 的介绍和安装
  2. Grafana监控大屏配置参数介绍(一)
  3. Grafana监控大屏配置参数介绍(二)
  4. Grafana监控大屏可视化图表

Spring Boot Admin 2 系列文章:

  1. Spring Boot Admin 参考指南
  2. SpringBoot Admin服务离线、不显示健康信息的问题
  3. Spring Boot Admin2 @EnableAdminServer的加载
  4. Spring Boot Admin2 AdminServerAutoConfiguration详解
  5. Spring Boot Admin2 实例状态监控详解
  6. Spring Boot Admin2 自定义JVM监控通知
  7. Spring Boot Admin2 自定义异常监控
  8. Spring Boot Admin 监控指标接入Grafana可视化

本文转载自: https://blog.csdn.net/weixin_40972073/article/details/128328251
版权归原作者 阿提说说 所有, 如有侵权,请联系我们删除。

“Spring Boot 3.x微服务升级经历”的评论:

还没有评论