欢迎光临
我们一直在努力

Java-微服务升级

前言

之前我的微服务版本是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版本对应关系
image.png

spring和elasticsearch版本对应关系
image.png

spring-cloud和spring-cloud-alibaba版本对应关系
image.png

有了上面的版本对应关系,于是我们选择了如下的版本:

<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

image.png

3.2添加jdk17

image.png

3.3language level选择jdk17

image.png

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

image.png

保存并退出即可!

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 application

java.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-alpine
MAINTAINER "zhangwei"<zhangwei900808@126.com>
RUN mkdir -p /usr/local/spaceservice
ARG JAR_FILE
ADD ${JAR_FILE} /usr/local/spaceservice/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/usr/local/spaceservice/app.jar"]
EXPOSE 8902

修改后:

FROM openjdk:17-jdk
MAINTAINER "zhangwei"<zhangwei900808@126.com>
RUN mkdir -p /usr/local/spaceservice
ARG JAR_FILE
ADD ${JAR_FILE} /usr/local/spaceservice/app.jar
ENTRYPOINT ["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

https://segmentfault.com/a/1190000043926595

未经允许不得转载:IT极限技术分享汇 » Java-微服务升级

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址