springboot 升级笔记
我的项目使用了 spring cloud、spring boot、 spring cloud alibaba,之前 nacos 是单机模式,微服务注册没有出现异常。最近尝试把 nacos 改为集群模式部署以后,部分微服务无法注册到 nacos,报错:
server is DOWNnow, detailed error message: Optional[Distro protocol is not initialized]
#详细报错
com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([XXX:8848]) tried: ErrCode:503, ErrMsg:server is DOWNnow, detailed error message: Optional[Distro protocol is not initialized]
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:552)
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:491)
另一种报错
receive invalid redirect request from peer 172.20.0.1
按照网上的资料,基本是 2 个处理思路:
- 检查端口开放,要开放 8848、9848 端口
- nacos 配置文件里指定 ip 地址
都尝试过,但未解决。最终想到可能是版本不一致导致。查看 spring cloud 阿里巴巴版本对应表( https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E ),确实有差异。所以决定修改各个组件的版本
版本目标
原 springboot 版本:2.0.4.RELEASE
修改目标:
- springboot 至 2.3.12.RELEASE
- springcloud 至 Spring Cloud Hoxton.SR12
- ailibabaspringcloud 至 2.2.9.RELEASE
修改项目 pom 文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 中间略过一部分 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<nacos-config-spring-cloud.version>2.2.9.RELEASE</nacos-config-spring-cloud.version>
<nacos-discovery-spring-cloud.version>2.2.9.RELEASE</nacos-discovery-spring-cloud.version>
</properties>
mongodb 配置
springboot 版本改变后,mongodb 对应的 jar 包版本改变,导致原配置报错
原配置手动写了 mongoDbFactory、gridFsTemplate、mongoOptions、mongoClient 等 bean。新版本只要写 getGridFSBucket 即可:
public class MongoConfig {
@Value("${spring.data.mongodb.authentication-database}")
String database;
@Bean
public GridFSBucket getGridFSBucket(MongoClient mongoClient){
MongoDatabase mongoDatabase = mongoClient.getDatabase(database);
return GridFSBuckets.create(mongoDatabase);
}
}
spring 配置文件修改
- spring.datasource.driverClassName
原本是com.mysql.jdbc.Driver
,改为:
com.mysql.cj.jdbc.Driver
- 增加配置 spring.main.allow-bean-definition-overriding
spring.main.allow-bean-definition-overriding=true
druid 版本
涉及 datetime 等类型的 sql 报错,mybatisplus 报错:
Cause: java.sql.SQLFeatureNotSupportedException: null; nested exception is java.sql.SQLFeatureNotSupportedException
原因:druid 版本过低,修改为:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
validation 修改
更新版本后,javax.validation 包丢失。增加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
项目启动时循环依赖报错
这里耗费了大量时间修改
短期处理:在循环依赖报错的引用上增加@Lazy 注释
长期处理:设计时尽量避免循环依赖
成果
nacos 微服务注册成功,并且项目启动速度快了 20%~30%左右。