草庐IT

微服务 Spring Cloud 2021 Spring Boot 2.7.x Java JDK8升级到JDK17研究

zhaoyang10 2023-06-14 原文

目录

一、 现状

项目正在使用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包升级

<properties>
        <!-- maven build -->
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
        <maven.javadoc.skip>true</maven.javadoc.skip>

        <!-- spring boot -->
        <spring-boot.version>2.7.5</spring-boot.version>

        <!-- spring cloud -->
        <spring-cloud.version>2021.0.5</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
        <spring-cloud-starter-alibaba-nacos-config.version>2.1.4.RELEASE</spring-cloud-starter-alibaba-nacos-config.version>
</properties>

<dependencies>
		<!-- jdk17删除的包引入 -->
		<dependency>
		 	<groupId>javax.validation</groupId>
		 	<artifactId>validation-api</artifactId>
		</dependency>
		<dependency>
           	<groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- 不加会加载不到BootStrap.yml文件 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${spring-cloud-starter-alibaba-nacos-config.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
</dependencies>
<!-- 管理依赖版本号,子项目不会默认依赖 -->
<dependencyManagement>
    <dependencies>
        <!-- spring boot 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- spring cloud 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- spring cloud alibaba 依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3.3 代码改动

  1. 还有一些配置类有些方法升级后已经被标识为废弃 这个看情况是否需要改动。

  2. Dockerfile配置修改 基础jdk镜像升级 由jdk1.8升级到jdk17 FROM registry.api.xxx.com/bop-k8s/base_image:openjdk17.0.6

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/heapdump.hprof -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

有关微服务 Spring Cloud 2021 Spring Boot 2.7.x Java JDK8升级到JDK17研究的更多相关文章

  1. 【云原生】SpringCloud-Spring Boot Starter使用测试 - 2

    目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一

  2. ruby - 无法激活 susy-2.1.1,因为 sass-3.2.17 与 sass 冲突 (~> 3.3.0) - 2

    我已经安装了最新版本的compass、sass和susy。但我仍然收到此错误:Unabletoactivatesusy-2.1.1,becausesass-3.2.17conflictswithsass(~>3.3.0)有人知道这个Ruby是如何工作的吗?这是我安装的gem的列表:***LOCALGEMS***CFPropertyList(2.2.0)chunky_png(1.3.0)compass(0.12.4)compass-core(1.0.0.alpha.19)compass-import-once(1.0.4)compass-rails(1.1.3)fssm(0.2.10)l

  3. springboot定时任务 - 2

    如果您希望在Spring中启用定时任务功能,则需要在主类上添加 @EnableScheduling 注解。这样Spring才会扫描 @Scheduled 注解并执行定时任务。在大多数情况下,只需要在主类上添加 @EnableScheduling 注解即可,不需要在Service层或其他类中再次添加。以下是一个示例,演示如何在SpringBoot中启用定时任务功能:@SpringBootApplication@EnableSchedulingpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.ru

  4. 基于SpringBoot的线上日志阅读器 - 2

    软件特点部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式,支持大文件的读取。支持实时打印新增的日志(类终端)。支持日志搜索。使用手册基本页面配置路径配置日志所在的目录,配置后按回车键生效,下拉框选择日志名称。选择日志后点击生效,即可加载日志。windows路径E:\java\project\log-view\logslinux路径/usr/local/XX历史模式历史模式下,不会读取新增的日志。针对历史文件可以分页读取,配置分页大小、跳转。历史模式下,支持根据关键词搜索。目前搜索引擎使用的是jdk自带类库,搜索速度相对较低,优点是比较简单。2G日志全文搜

  5. springboot使用validator进行参数校验 - 2

    1.依赖导入org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-validation2.validation常用注解@Null被注释的元素必须为null@NotNull被注释的元素不能为null,可以为空字符串@AssertTrue被注释的元素必须为true@AssertFalse被注释的元素必须为false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@D

  6. 停车系统源码-基于springboot+uniapp开源项目 - 2

    Iparking停车收费管理系统-可商用介绍Iparking是一款基于springBoot的停车收费管理系统,支持封闭车场和路边车场,支持微信支付宝多种支付渠道,支持多种硬件,涵盖了停车场管理系统的所有基础功能。技术栈Springboot,MybatisPlus,Beetl,Mysql,Redis,RabbitMQ,UniApp功能云端功能序号模块功能描述1系统管理菜单管理配置系统菜单2系统管理组织管理管理组织机构3系统管理角色管理配置系统角色,包含数据权限和功能权限配置4系统管理用户管理管理后台用户5系统管理租户管理多租户管理6系统管理公众号配置租户公众号配置7系统管理操作日志审计日志8系统

  7. SpringCloud入门实战(七)-Hystrix入门简介 - 2

    📝学技术、更要掌握学习的方法,一起学习,让进步发生👩🏻作者:一只IT攻城狮。💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。❤️《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址👉🏻SpringCloud入门实战系列不迷路👈🏻:SpringCloud入门实战(一)什么是SpringCloud?SpringCloud入门实战

  8. ruby - Fedora 17 上的 Heroku Toolbelt - 2

    我正在尝试执行教程的heroku设置部分http://ruby.railstutorial.org/.但是在https://toolbelt.heroku.com/,我注意到Fedora没有.rpm,所以我尝试分别安装Foreman和HerokuCLI。Foreman和Git安装正常,但我在使用HerokuCLI时遇到问题。当我尝试做的时候:$yuminstallrubygem-heroku然后简单地做$heroku我得到错误:/usr/share/rubygems/rubygems/dependency.rb:247:in`to_specs':Couldnotfindheroku(>

  9. 中国民用飞机制造行业市场现状规模及发展战略规划报告2021-2027年 - 2

    中国民用飞机制造行业市场现状规模及发展战略规划报告2021-2027年详情内容请咨询鸿晟信合研究院!【全新修订】:2022年2月【撰写单位】:鸿晟信合研究研究【报告目录】第1章:中国民用飞机制造行业发展综述1.1民用飞机制造行业概述1.1.1民用飞机的概念1.1.2飞机制造的概念1.1.3民用飞机的分类1.2民机制造行业周期特性1.2.1影响行业周期的因素(1)GDP增速分析(2)运量增量分析(3)飞机更替分析(4)航空公司获利水平1.2.2行业现阶段周期分析1.2.3行业现阶段景气分析1.3民机制造信息化分析1.3.1信息化技术应用状况分析(1)MDO技术应用分析(2)供应链协同研发分析(3

  10. 优化大数据量查询方案——SpringBoot(Cloud)整合ES - 2

    一、Elasticsearch简介实际业务场景中,多端的查询功能都有很大的优化空间。常见的处理方式有:建索引、建物化视图简化查询逻辑、DB层之上建立缓存、分页…然而随着业务数据量的不断增多,总有那么一张表或一个业务,是无法通过常规的处理方式来缩短查询时间的。在查询功能优化上,作为开发人员应该站在公司的角度,本着优化客户体验的目的去寻找解决方案。本人有幸做过Tomcat整合solr,今天一起研究一下当前比较火热的Elasticsearch搜索引擎。Elasticsearch是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch是由Elastic公司创建。它的代码位

随机推荐