分享Spring Boot 3.x微服务升级历程

 更新时间:2022年12月16日 12:03:58   投稿:mrr  
Spring Boot 3.0.0 GA版已经发布,好多人也开始尝试升级,有人测试升级后,启动速度确实快了不少,这篇文章主要介绍了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 Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.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 to add 'org.slf4j' to prefer-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: Unable to load instance for com.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: Unable to initialize Apollo Spring Injector!
    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: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @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依赖问题,由于时间关系,没有再继续,问题留到以后再弄,后面有新进展,会持续更新该文。

到此这篇关于Spring Boot 3.x微服务升级经历的文章就介绍到这了,更多相关Spring Boot 3.x微服务升级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Agent 动态修改字节码详情

    Java Agent 动态修改字节码详情

    这篇文章主要介绍了Java Agent动态修改字节码的相关资料,需要的朋友可以参考下面文章具体的内容
    2021-09-09
  • RestTemplate的DELETE及PUT等请求方法使用精讲

    RestTemplate的DELETE及PUT等请求方法使用精讲

    这篇文章主要为大家介绍了RestTemplate的DELETE及PUT等请求方法的使用精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Java实现文件上传到服务器本地并通过url访问的方法步骤

    Java实现文件上传到服务器本地并通过url访问的方法步骤

    最近项目中使用到了文件上传到服务器的功能,下面这篇文章主要给大家介绍了关于Java实现文件上传到服务器本地并通过url访问的方法步骤,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Spring Security的持久化用户和授权实现方式

    Spring Security的持久化用户和授权实现方式

    文章介绍了如何使用JdbcUserDetailsManager实现数据库读取用户,并展示了如何配置SpringSecurity进行授权管理,通过创建数据库表、配置数据库连接和修改SecurityConfig,实现了用户权限的控制
    2025-02-02
  • StreamAPI多次消费一个stream代码实例

    StreamAPI多次消费一个stream代码实例

    这篇文章主要介绍了StreamAPI多次消费一个stream代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java实现String字符串处理各种类型转换

    java实现String字符串处理各种类型转换

    在日常的程序开发中,经常会涉及到不同类型之间的转换,本文主要介绍了String字符串处理各种类型转换,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • SpringBoot实现对Http接口进行监控的代码

    SpringBoot实现对Http接口进行监控的代码

    Spring Boot Actuator是Spring Boot提供的一个模块,用于监控和管理Spring Boot应用程序的运行时信息,本文将介绍一下Spring Boot Actuator以及代码示例,以及如何进行接口请求监控,需要的朋友可以参考下
    2024-07-07
  • 详解eclipse项目中的.classpath文件原理

    详解eclipse项目中的.classpath文件原理

    这篇文章介绍了eclipse项目中的.classpath文件的原理,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 关于kafka消费不到远程bootstrap-server 数据的问题

    关于kafka消费不到远程bootstrap-server 数据的问题

    很多朋友遇到kafka消费不到远程bootstrap-server 数据的问题,怎么解决这个问题,很多朋友不知所措,下面小编给大家带来了关于kafka消费不到远程bootstrap-server 数据的问题及解决方法,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • 一文掌握Spring 中 @Component 和 @Bean 区别(最新推荐)

    一文掌握Spring 中 @Component 和 @Bean 区别(最新推荐)

    ​@Component 用于标识一个普通的类,@Bean用于配置类里面,在方法上面声明和配置 Bean 对象,这篇文章主要介绍了Spring 中 @Component 和 @Bean 区别(最新推荐),需要的朋友可以参考下
    2024-04-04

最新评论