微服务 Spring Cloud 2021 Spring Boot 2.7.x Java JDK8升级到JDK17研究
目录
- 一、现状
- 二、升级计划
- 三、升级注意事项
-
- 3.1 介绍
-
- 1.jdk8到jdk17版本介绍及升级注意事项
- 2.Spring Boot 2.7.x新特性
- 3.Spring Cloud 2021.0.5新特性及升级注意事项
-
- 3.1 OpenFeign LoadBalancer
- 3.2 Sleuth
- 4.Spring Cloud 与Spring Boot 版本对应关系
- 3.2 jar包升级
- 3.3 代码改动
- 3.4 jenkins 配置修改
-
- 1.服务中 JVM 参数配置示例:
- 2.报错
一、现状
项目正在使用jdk8 如果要升级到jdk17 则需要升级springboot版本及springcloud版本 (springcloud版本和springboot版本必须匹配 要一块升级) 。目前使用的版本如下:
spring boot 版本为 2.1.5.RELEASE
spring cloud 版本为 Greenwich.SR2
spring 版本为 5.1.7.RELEASE
二、升级计划
jdk 由 8 升级到 17
spring boot 由 2.1.5.RELEASE 升级到 2.7.5
spring cloud 由 Greenwich.SR2 升级到 2021.0.5
spring 由 5.1.7.RELEASE 升级到 5.3.22 (自动依赖无需配置)
spring-boot-maven-plugin 升级到 和 springboot版本一致
三、升级注意事项
3.1 介绍
1.jdk8到jdk17版本介绍及升级注意事项
一文详解|从JDK8飞升到JDK17,再到未来的JDK21
主要看升级问题经验部分
Java8 到 Java17之间的特性描述
项目中受影响的变化:
JEP 320: Remove the Java EE and CORBA Modules (openjdk.org/jeps/320) 提案,移除了 Java EE and CORBA 的模块
jdk 移除了javax包 可以使用 jakarta.validation-api替代 如果还需要使用 需要maven手动引入依赖jar 比如:javax.validation-api
2.Spring Boot 2.7.x新特性
Spring Boot 2.7.0 新特性
Spring Boot 2.6.0 新特性
Spring boot 2.2.x ~ 2.5.x 各版本特性 已停止更新维护
3.Spring Cloud 2021.0.5新特性及升级注意事项
Spring Boot 2.2.5 升级到 2.7.7 Spring Cloud Hoxton.SR10 升级到 2021.0.5 Spring Cloud Alibaba 2.2.1.RELEASE 升级到 2021.0.4
Spring Cloud 2021 新特性
Spring Cloud 2021.0.0 新特性
Spring Cloud 2020.0.0新特性
Spring Cloud Hoxton 新特性
3.1 OpenFeign LoadBalancer
SpringCloud之OpenFeign的常用配置(超时、数据压缩、日志、重试等)
SpringCloud OpenFeign 请求重试
Spring Cloud Feign–解决spring-cloud-loadbalancer的缓存警告
Ribbon 的替代品 Spring Cloud Loadbalancer 使用与原理分析
3.2 Sleuth
解决sleuth链路追踪失效的问题,sleuth版本升级为3.1.3后X-B3-TraceId:-打印不出来了,解决方案
为啥要使用spring-cloud:2021.0.x?
原先使用Hoxton.SR8版本的springcloud,由于Netflix公司宣布其核心组件Hystrix、Ribbon、Zuul、Eureka等进入维护状态,不再进行新特性开发,只修 BUG。而spring官方因此做出应对,在新版本中移除了Netflix
4.Spring Cloud 与Spring Boot 版本对应关系
maven开源仓库版本查看
spring boot dependencies maven仓库
spring cloud dependencies maven仓库
spring cloud & spring boot最新对应关系查看



红色表示已停止维护、已过时 绿色表示可用
注册中心:eureka(停更)、Zookeeper、Consul(go语言编写)、Nacos
服务调用:Ribbon、LoadBalancer(新出的)/ Feign(Netfilx公司不在更新)、OpenFeign(Spring公司自己出的,与Feign相当于葫芦娃兄弟,几乎一样)
服务降级:Hystrix(cloud自带的停更,国内依然很多使用,其思想很值得学习),resilience4j(国外推荐代替Hystrix),sentienl(国内一般推荐用这个,阿里出品)
服务网关:Zuul(内部原因没出Zuul2)gateway(Spring自己推出的)
服务配置:Config,Nacos(把Config替代了)
服务总线:Bus(淘汰) Nacos
3.2 jar包升级
17
UTF-8
3.10.1
true
2.7.5
2021.0.5
2021.1
2.1.4.RELEASE
javax.validation
validation-api
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-starter-bootstrap
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
${spring-cloud-starter-alibaba-nacos-config.version}
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-validation
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-configuration-processor
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
3.3 代码改动
-
还有一些配置类有些方法升级后已经被标识为废弃 这个看情况是否需要改动。
-
Dockerfile配置修改 基础jdk镜像升级 由jdk1.8升级到jdk17 FROM registry.api.xxx.com/bop-k8s/base_image:openjdk17.0.6
openjdk17镜像:
docker pull khipu/openjdk17-alpine:latest
3.4 jenkins 配置修改
1.服务中 JVM 参数配置示例:
JAVA_OPTS=‘-server -XX:+UseG1GC -Xmx2548m -Xss512k -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=256m -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/ -Dlog4j2.formatMsgNoLookups=true’ \
docker run 启动参数中 jvm参数在jdk17中已被删除
删除 -XX:+UseCGroupMemoryLimitForHeap
2.报错
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 @5b464ce8
org.springframework.cglib.core.CodeGenerationException: 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 @5b464ce8
这是由于 JDK 8 中有关反射相关的功能自从 JDK 9 开始就已经被限制了,为了兼容原先的版本,需要在运行项目时 JVM参数添加 –add-opens java.base/java.lang=ALL-UNNAMED 选项来开启这种默认不被允许的行为。
反射+私有API调用问题
在 Java8 中,没有人能阻止你访问特定的包,比如 sun.misc,对反射也没有限制,只要 setAccessible(true) 就可以了。Java9 模块化以后,一切都变了,只能通过 –add-exports 和 –add-opens 来打破模块封装
–add-opens 导出特定的包
–add-opens 允许模块中特定包的类路径深度反射访问
比如:
–add-opens java.base/java.lang=ALL-UNNAMED
–add-opens java.base/java.io=ALL-UNNAMED
–add-opens java.base/java.math=ALL-UNNAMED
–add-opens java.base/java.net=ALL-UNNAMED
–add-opens java.base/java.nio=ALL-UNNAMED
–add-opens java.base/java.security=ALL-UNNAMED
–add-opens java.base/java.text=ALL-UNNAMED
–add-opens java.base/java.time=ALL-UNNAMED
–add-opens java.base/java.util=ALL-UNNAMED
–add-opens java.base/jdk.internal.access=ALL-UNNAMED
–add-opens java.base/jdk.internal.misc=ALL-UNNAMED
java17启动eureka-server
示例
java -jar --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED /Users/fengzy/Documents/git/eureka-server-1.0.0.jar
java17 可能需要依赖的jar包
报错:com/sun/activation/registries/LogSupport
在 pom 文件中引入依赖:
javax.activation
activation
1.1.1
异常处理:java.lang.ClassNotFoundException: javax.xml.bind.JAXBContext
在 pom 文件中引入依赖:
javax.xml.bind
jaxb-api
2.3.1
com.sun.xml.bind
jaxb-impl
2.3.1
org.glassfish.jaxb
jaxb-runtime
2.3.1
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/0a67628bc4.html
