前言

之前我的微服务版本是java8、spring-boot2.4.2、spring-cloud2020.0.0、spring-cloud-alibaba2021.1,然而最近随着spring-boot3.0版本的公布,再加上官网曾经阐明最低版本反对java17,所以就有了这篇文章。

<properties>    <java.version>1.8</java.version>    <spring-boot.version>2.4.2</spring-boot.version>    <spring-cloud.version>2020.0.0</spring-cloud.version>    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version></properties>

目前,Oracle 官网反对的最新 LTS(长期反对)版本是 JDK 17,而 OpenJDK 社区也正在踊跃开发和保护 JDK 17。

因而,如果你思考降级 Java 版本,并且心愿应用一个稳固和牢靠的版本,那么倡议抉择 JDK 17。JDK 17 蕴含了很多新个性和改良,例如:

新的垃圾回收器:ZGC 和 Shenandoah;
加强的 Switch 表达式;
改良的异样解决;
新的日期和工夫 API;
...
此外,JDK 17 也提供了宽泛的操作系统、硬件平台和云平台反对,能够实用于各种不同的利用场景。同时,因为 JDK 17 是一个 LTS 版本,因而能够取得更长时间的更新和反对,从而提供更好的稳定性和安全性。

总之,倡议抉择 JDK 17 作为降级指标,以获得最佳的兼容性、稳定性和安全性。

版本参照

上面列出了spring-boot、spring-cloud和spring-cloud-alibaba的版本对应关系,抉择适合的版本不要呈现兼容性问题。
spring-boot和spring-cloud版本对应关系

spring和elasticsearch版本对应关系

spring-cloud和spring-cloud-alibaba版本对应关系

有了下面的版本对应关系,于是咱们抉择了如下的版本:

<properties>    <java.version>17</java.version>    <spring-boot.version>3.0.2</spring-boot.version>    <spring-cloud.version>2022.0.0</spring-cloud.version>    <spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version></properties>

降级微服务

1、装置java17
这里不做具体介绍了,这个应该是必备的,我给出下载地址:java17下载和jdk装置

2、装置maven 3.9
这里不做具体介绍了,这个应该是必备的,我给出下载地址:maven下载和maven装置

3、配置idea

3.1设置版本都为java17

3.2增加jdk17

3.3language level抉择jdk17

3.4modules中设置sources的language level都是project default即可

保留并退出即可!

4、配置pom.xml

上面是我的pom.xml大家能够做为降级参考:

<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>3.0.2</version>    <relativePath/></parent><properties>    <java.version>17</java.version>    <spring-boot.version>3.0.2</spring-boot.version>    <spring-cloud.version>2022.0.0</spring-cloud.version>    <spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version></properties><dependencyManagement><dependencies>    <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><dependencies>    <!-- 必须增加的 依赖 -->    <dependency>        <groupId>jakarta.platform</groupId>        <artifactId>jakarta.jakartaee-api</artifactId>        <version>10.0.0</version>        <scope>provided</scope>    </dependency>    <!-- 必须增加的 依赖(如果你有的话) -->    <dependency>      <groupId>org.projectlombok</groupId>      <artifactId>lombok</artifactId>      <version>1.18.28</version>      <scope>provided</scope>      </dependency>    <!-- 必须增加的 依赖(如果你有的话) -->    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-stream</artifactId>        <version>4.0.1</version>    </dependency>    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-stream-binder-kafka</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-stream-binder-rabbit</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>    </dependency></dependencies><build>    <plugins>        <plugin>            <groupId>com.spotify</groupId>            <artifactId>dockerfile-maven-plugin</artifactId>            <version>1.4.10</version>            <configuration>                <dockerfile>src/main/docker/Dockerfile</dockerfile>                <!--                    <repository>spotify/foobar</repository>-->                <!--<tag>${project.version}</tag>-->                <buildArgs>                    <!--提供参数向Dockerfile传递-->                    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>                </buildArgs>            </configuration>        </plugin>        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>        </plugin>    </plugins></build>

下面引入了jakartaee依赖,这是有历史起因的,感兴趣的能够看看[这篇文章 ]()

5、以javax结尾的全副换成jakarta结尾

批改前:

import javax.servlet.*;import javax.servlet.http.HttpServletRequest;

批改后:

import jakarta.servlet.*;import jakarta.servlet.http.HttpServletRequest;

6、spring.redis换成spring.data.redis
如果你应用了redis,那么你就要调整成上面的模式:
调整前:

spring:  redis:  database: 0  host: xxx.xxx.xxx.xxx  password: password  port: 6379  timeout: 5000ms  lettuce:    pool:      max-active: 500      max-wait: 500ms      max-idle: 500      min-idle: 0

调整后:

spring:  data:    redis:    database: 0    host: xxx.xxx.xxx.xxx    password: password    port: 6379    timeout: 5000ms    lettuce:      pool:        max-active: 500        max-wait: 500ms        max-idle: 500        min-idle: 0

7、spring-cloud-stream 换成4.0.1版本

这是spring-cloud-stream的bug,如果不换成4.0.1的话会报错:

2023-06-18T11:25:07.771+08:00  WARN 68477 --- [           main] o.s.c.s.binder.DefaultBinderFactory      : Failed to propagate child beans. This may cause issues in your applicationjava.lang.IllegalStateException: kafka-binder_context has not been refreshed yet

所以换成上面的包就没问题:

<dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-stream</artifactId>    <version>4.0.1</version></dependency>

8、批改dockerfile
批改前:

FROM openjdk:8-jdk-alpineMAINTAINER "zhangwei"<zhangwei900808@126.com>RUN mkdir -p /usr/local/spaceserviceARG JAR_FILEADD ${JAR_FILE} /usr/local/spaceservice/app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/usr/local/spaceservice/app.jar"]EXPOSE 8902

批改后:

FROM openjdk:17-jdkMAINTAINER "zhangwei"<zhangwei900808@126.com>RUN mkdir -p /usr/local/spaceserviceARG JAR_FILEADD ${JAR_FILE} /usr/local/spaceservice/app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/usr/local/spaceservice/app.jar"]EXPOSE 8902

9、批改k8s file
批改前:

...  template:    metadata:      labels:        app: <podname>    spec:      containers:      - env:        - name: LANG          value: C.UTF-8        - name: JAVA_HOME          value: /usr/lib/jvm/java-1.8-openjdk...

批改后:

...  template:    metadata:      labels:        app: <podname>    spec:      containers:      - env:        - name: LANG          value: C.UTF-8        - name: JAVA_HOME          value: /usr/lib/jvm/java-17-openjdk...

这样就实现了降级!

10、jenkins装置java17和maven3.9

总结

1、我也是查看他人的文章和本人摸索进去的,基于自己能力无限,如果呈现问题请不吝赐教。

参考

在 idea 中配置 jdk17