你好,我是柳岸花开。
随着项目的深入开展,客户对系统安全性提出了更高的要求,尤其是在安全漏洞和渗透测试方面。当前,我们使用的 SpringCloud 版本是 Hoxton,其生命周期已于 2022 年 2 月 28 日结束。最新的稳定版本是 2021.0.1。为了给客户提供更安全的产品,同时使代码更易于维护和扩展,升级 SpringCloud 版本势在必行。
2021 版本升级注意事项
1 Feign 相关
-
@FeignClient
接口上不能有@RequestMapping
注解,地址需在方法上配置。 -
contextId
不能使用占位符,命名规则为:服务名-接口类名,例如:contextId = "uc-userApi"
。
错误示例:
@RequestMapping("/open/order")
@FeignClient(name = "${trade.name:platform-tc}", contextId = "${trade.name:platform-tc}-orderApi")
public interface OrderApi {
@PostMapping(value = "/updateStatus")
Result<Void> updateStatus(@RequestBody OrderUpdateStatusReq req);
}
正确示例:
@FeignClient(name = "${trade.name:platform-tc}", contextId = "tc-orderApi")
public interface OrderApi {
@PostMapping(value = "/open/order/updateStatus")
Result<Void> updateStatus(@RequestBody OrderUpdateStatusReq req);
}
@RestController
public class OrderOpenController implements OrderApi {
@Resource
private OrderService orderService;
@Override
public Result<Void> updateStatus(@RequestBody OrderUpdateStatusReq req) {
// 实现方法
}
}
2 bootstrap.yaml
不生效
引入以下依赖即可:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
3 shardingsphere-jdbc
启动报错
错误日志:
2022-03-27 12:20:16.834 WARN [-127.0.0.1] .a.j.DataSourceHealthIndicator [] : DataSource health check failed
org.springframework.dao.InvalidDataAccessApiUsageException: ConnectionCallback; isValid; nested exception is java.sql.SQLFeatureNotSupportedException: isValid
错误原因: Actuator 健康检查 DB 状态失败。
改造方法: 自定义 DB 健康检查配置
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthIndicatorProperties;
import org.springframework.boot.actuate.health.HealthContributor;
import org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Map;
@Configuration
public class DataSourceHealthConfig extends DataSourceHealthContributorAutoConfiguration {
private String defaultQuery = "select 1";
public DataSourceHealthConfig(ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
super(metadataProviders);
}
@Bean
@Override
public HealthContributor dbHealthContributor(Map<String, DataSource> dataSources,
DataSourceHealthIndicatorProperties dataSourceHealthIndicatorProperties) {
HealthContributor healthContributor = super.dbHealthContributor(dataSources, dataSourceHealthIndicatorProperties);
if (healthContributor instanceof DataSourceHealthIndicator) {
((DataSourceHealthIndicator) healthContributor).setQuery(defaultQuery);
}
return healthContributor;
}
}
4 LoadBalancer 替代 Ribbon
新版默认不再使用 Ribbon,代码和配置中不要有 Ribbon 相关内容。使用 LoadBalancer 替代,需要引入以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
在 yaml
文件中增加如下配置:
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
5 参数校验框架
需要手动引入校验框架:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
6 循环依赖支持
SpringBoot 2.6.x 默认关闭了循环依赖支持。推荐修改代码去掉循环依赖,如果修改成本较高,可通过如下配置开启:
spring:
main:
allow-circular-references: true
注意事项
1 Maven 版本管理
-
不要使用 common-lang
,统一使用common-lang3
。 -
不要使用 Swagger,用 YAPI 代替。
2 JDK 兼容
为了以后 JDK 版本升级时代码兼容,尽量使用兼容性好的依赖,例如:base64 处理使用 java.util.Base64
。
在 IDEA 下可以切换到 JDK 11 来检测代码兼容性。
通过以上内容,我们可以顺利完成 SpringCloud 版本的升级,为客户提供更加安全和高效的系统。如果在升级过程中遇到问题,可以在评论区留言。
👇关注我,下期了解👇 Nacos源码 回复 222,获取Java面试题合集 关于我 一枚爱折腾的Java程序猿,专注Spring干货。把路上的问题记录下来,帮助那些和我一样的人。 好奇心强,喜欢并深入研究古天文。 崇尚 个人系统创建,做一些时间越长越有价值的事情。思考 把时间留下来 又 每刻都是新的。
本文由 mdnice 多平台发布