SpringBoot&SpringCloud升级踩坑

前言

最近遇到了一个项目,需求是升级springboot版本。项目用到了很多组件,redis、Apollo、zipkin以及SpringCloud的一套组件。升级过程踩了很多坑,我把自己遇到的问题整理了一下供大家学习交流。

1.版本选择

SpringBoot 1.4.2 ——> 2.3.2
SpringCloud 1.3.1 ——>Hoxton.SR6
jedis 2.8.2 ——>3.3.0
Zipkin的版本仍然使用11.2.0.4的,没有做升级
Apollo-client也没有做升级,使用的是1.6.0的版本

2.升级SpringCloud遇到的问题

2.1依赖问题

首先,确保SpringBoot和SpringCloud版本对应起来。
在SpringBoot2.x之后的SpringCloud的依赖有一些变化
SpringBoot2.x之前

<!--        eureka客户端       -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
<!--        ribbon负载均衡      -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
<!--        eureka服务端       -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>

SpringBoot2.x之后

<!--        ribbon负载均衡      -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
<!--        eureka客户端       -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
<!--        eureka服务端       -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

2.2配置问题

SpringCloud获取eureka实例的参数改变了
升级前:

${spring.cloud.client.ipAddress}

升级后:

${spring.cloud.client.ip-address}

3.jedis问题

jedis在3.0之前和之后在关闭资源上也有一些变化
image.png

我们可以看到源码上注释说,这两个方法在3.0之后不用了。如果我们自己写了dataSource就需要做出相应的修改。
jedis3.0之前的实现方式

    public void closeResource(Jedis jedis, boolean broken) {
        if (jedis != null) {
            try {
                if (broken) {
                    this.pool.(jedis);
                } else {
                    this.pool.returnResource(jedis);
                }
            } catch (Exception var4) {
                this.log.error(var4.getMessage(), var4);
            }
        }
    }

jedis之后我们的实现方式

    public void closeResource(Jedis jedis, boolean broken) {
        if (jedis != null) {
            jedis.close();
        }
    }

4.可能出现的其他问题

4.1启动报xxx环境错误

可能是spring热部署的配置没有关闭

spring.devtools.restart.enabled=false

4.2SpringBean不唯一

如果之前的项目没有这个问题,那我们加一个配置把重复的bean覆盖掉就好了

spring.main.allow-bean-definition-overriding=true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。