springboot3.x微服务升级经历(代码片段)

阿提说说 阿提说说     2022-12-16     544

关键词:

前言

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依赖问题,由于时间关系,没有再继续,问题留到以后再弄,后面有新进展,会持续更新该文。

作者其他文章:
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可视化

目前在将作品升级到《深入浅出springboot3.x》,希望大家多多支持。(代码片段)

时过境迁,在2018年,本人出版了《深入浅出SpringBoot2.x》称为了业界畅销书籍。如今随着时间到了2021年,JakartaEE也得到了长足的发展,加上Java8语法的严重落后于其他语言,导致了Java语言发展也遇到了瓶颈。... 查看详情

springboot3.x原生镜像-nativeimage尝鲜(代码片段)

...ative实验项目中酝酿了3年多之后,随着SpringFramework6和SpringBoot3的发布,对应的项目就是SpringNative,原生镜像支持将会发布GA版本(换言之就是,NativeIma 查看详情

升级微服务架构2:服务注册(代码片段)

  微服务架构中,服务是最小的可伸缩的独立部署的单位,同一个服务提供可以有多个实例,这些实例都会注册到服务注册中心(EurekaServer)上进行统一的管理及调用的负载均衡。  因SpringCloud的是已Java为主要开发语言,本... 查看详情

升级微服务架构3:服务发现及服务相互调用(代码片段)

  一个微服务架构的系统中,不同服务之间是会相互调用的,如一个订单服务需要取用户数据,则需要调用用户服务,有多个用户服务实例时,Eureka会负载均衡到其中一个服务实例,和上一章一样,我们先通过Java版的服务发... 查看详情

升级微服务架构1:搭建eurekaserver服务中心(代码片段)

   SpringCloud中使用Eureka来做服务注册和发现,来统一管理微服务实例。  1.使用IDEA创建一个空的Maven项目做父模块   (也可以不用父项目,所有模块都用平行结构)    删除父模块src文件夹    可使用Sprin... 查看详情

第①篇springboot3.x的到来(代码片段)

1.1SpringBoot的特点谈到SpringBoot,就让我们先来了解它的特点。依据官方的文档,SpringBoot的特点如下:创建独立的Spring应用程序;嵌入的Tomcat、Jetty或者Undertow,无须部署WAR文件;允许通过Maven或Gradle来根据需... 查看详情

springcloud微服务架构升级总结(代码片段)

SpringCloud微服务架构升级总结wuli程序员 2019-06-2615:37:28一、背景1.1应用系统的架构历史 1.2什么是微服务?起源:微服务的概念源于2014年3月MartinFowler所写的一篇文章“Microservices”。文中内容提到:微服务架构是一种架构模... 查看详情

springcloud升级之路2020.0.x版-6.微服务特性相关的依赖说明(代码片段)

...个模块包括:spring-framework-common的依赖同步与异步微服务公共的依赖同步与异步微服务公共的框 查看详情

springcloud升级之路2020.0.x版-2.微服务框架需要考虑的问题(代码片段)

...言交流,谢谢!~上图中演示了一个非常简单的微服务架构:微服务会向注册中心进行注册。微服务从注册中心读取服务实例列表。基于 查看详情

初识微服务(代码片段)

一.单体架构和微服务架构的比较1.单体架构的优势和不足单体架构的优势:在项目的初期便于开发、便于测试、便于部署单体架构的不足:复杂性高-代码难以理解,难以修改和重构交付效率低-项目整体部署耗时长、难以定位问... 查看详情

在一个微服务网络中对springcloud项目的依赖性版本(代码片段)

有关使用SpringCloud项目正确设置微服务基础架构的问题。我们假设有服务发现,网关,配置服务和一些自定义服务。所有这些都依赖于Camden版本的SpringCloud项目。并且有必要将其中一个(比如Gateway)升级到Edware版本。微服务的其... 查看详情

springcloud微服务优雅下线+灰度发布的正确姿势,写得太好了!(代码片段)

###前言在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题。如果在我们升级服务的时候,会造成一段时间内的服务不可用,这就是不够优雅的。那什么是优雅的呢ÿ... 查看详情

漫画:什么是微服务?(代码片段)

  单体架构的痛点    缺点一:项目过于臃肿当大大小小的功能模块都集中在同一项目的时候,整个项目必然会变得臃肿,让开发者难以维护。 缺点二:资源无法隔离就像刚刚小灰的经历一样,整个单体系... 查看详情

微服务全链路灰度新能力(代码片段)

背景微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发版依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,... 查看详情

springcloud-netflix-01-什么是微服务?(代码片段)

文章目录一、什么是微服务?1.1系统架构的演变过程1.1.1单体应用架构1.1.2垂直应用架构1.1.3分布式架构1.1.4SOA架构1.1.5微服务架构1.2微服务架构设计原则1.2.1AKF拆分原则1.2.1.1X轴扩展(水平复制)1.2.1.2Y轴扩展(模块... 查看详情

springboot应用总结更新(代码片段)

SpringBoot的产生背景:SpringBoot的产生背景伴随着微服务,微服务的相关概念参考上一篇的博客,分布式架构理论;微服务的宏观概念理解:将一个大应用拆分成多个小应用,一个小应用是一个小型的服务,可以通过协议进行互通... 查看详情

一个宝藏级微服务开源项目,压箱底的了(代码片段)

前几天有粉丝留言,正在学习微服务,想让我推荐一个微服务学习项目。这次我拿出了压箱底的收藏了,一个宝藏级微服务开源项目,炸裂!前言zheng项目不仅仅是一个开发架构,而是努力打造一套从前端... 查看详情

abpframework7.0rc新增功能简介(代码片段)

...amework在架构上有四大目标:模块化、DDD、多租户和微服务。从 7.0 更新的功能来看,其侧重点转向微服务场景的实现,比如:Dapr集成、动态权限和功能、外部本地化、分布式实体缓存服务,都是对微服务和... 查看详情