一文解决所有SpringCloud升级问题

你好,我是柳岸花开。

随着项目的深入开展,客户对系统安全性提出了更高的要求,尤其是在安全漏洞和渗透测试方面。当前,我们使用的 SpringCloud 版本是 Hoxton,其生命周期已于 2022 年 2 月 28 日结束。最新的稳定版本是 2021.0.1。为了给客户提供更安全的产品,同时使代码更易于维护和扩展,升级 SpringCloud 版本势在必行。

2021 版本升级注意事项

1 Feign 相关

  1. @FeignClient 接口上不能有 @RequestMapping 注解,地址需在方法上配置。
  2. 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源码 ​ ​ alt ​ ​ 回复 222,获取Java面试题合集 ​ 关于我 ​ 一枚爱折腾的Java程序猿,专注Spring干货。把路上的问题记录下来,帮助那些和我一样的人。 ​ 好奇心强,喜欢并深入研究古天文。 ​ 崇尚 个人系统创建,做一些时间越长越有价值的事情。思考 把时间留下来 又 每刻都是新的。

本文由 mdnice 多平台发布

### Spring Cloud 和 Spring Cloud Alibaba 的介绍 Spring Cloud 是一个基于 Spring Boot 实现的微服务架构开发工具集,它提供了一系列用于快速构建分布式系统的工具,包括配置管理、服务发现、断路器、路由网关等功能[^1]。通过这些工具的支持,开发者可以更加高效地构建和部署复杂的分布式应用程序。 而 Spring Cloud Alibaba 则是在 Spring Cloud 基础上的扩展版本,旨在更好地支持阿里巴巴生态中的技术栈以及国内用户的实际需求[^2]。其主要目标是对现有的 Spring Cloud 功能进行补充和完善,同时集成阿里云的服务和技术能力,从而提升在国内环境下的适用性和性能表现。 --- ### Spring Cloud 和 Spring Cloud Alibaba 的区别 #### 1. **功能范围** - Spring Cloud 提供了一套通用的标准解决方案来解决微服务开发过程中的常见问题,例如服务注册与发现、负载均衡、熔断机制等。 - Spring Cloud Alibaba 不仅继承了 Spring Cloud 的核心特性,还引入了许多针对中国市场的优化措施及特定组件(如 Nacos、Sentinel),使得整个框架更贴合本地化场景的需求[^3]。 #### 2. **技术支持方向** - Spring Cloud 更注重国际化标准协议兼容性,适用于全球范围内多种不同类型的云计算平台之上运行的应用程序开发工作。 - 而 Spring Cloud Alibaba 主要围绕着阿里巴巴集团内部所使用的中间件产品线展开设计,比如 Dubbo RPC 框架和服务治理中心 Nacos 等,因此对于熟悉或者依赖于阿里的技术和基础设施体系结构的企业来说具有更高的契合度。 #### 3. **具体实现差异** 下表展示了两者之间部分重要模块的具体对比情况: | 组件名称 | Spring Cloud 默认实现 | Spring Cloud Alibaba 替代方案 | |----------------|------------------------------------------|----------------------------------------| | 配置管理 | Spring Cloud Config | Nacos | | 服务注册与发现 | Eureka | Nacos 或 Zookeeper | | 断路器 | Hystrix (已停止维护) | Sentinel | | 分布式链路追踪 | Sleuth + Zipkin | SkyWalking | 以上表格清晰表明,在某些方面 Spring Cloud Alibaba 使用了自己的替代品以满足特殊业务场景的要求并提高效率。 #### 4. **社区活跃程度与发展前景** 尽管两个项目都拥有庞大的用户群体和支持团队,但由于后者诞生时间较晚加上背后有强大的商业力量推动,所以在短期内可能会看到更多关于它的更新迭代动作发生;不过长期来看二者都会持续演进完善各自的生态系统。 --- ### 示例代码展示 以下是分别使用 `Eureka` 和 `Nacos` 进行简单服务注册的一个例子比较: #### 使用 Eureka 注册服务中心 ```java @SpringBootApplication @EnableEurekaClient public class ServiceApplication { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args); } } ``` #### 使用 Nacos 注册服务中心 ```java @SpringBootApplication @NacosDiscoveryProperties(serverAddr = "localhost:8848") public class ServiceApplicationWithNacos { public static void main(String[] args) { SpringApplication.run(ServiceApplicationWithNacos.class, args); } } ``` 上述两段代码片段直观体现了切换到新的注册方式只需要改变少量注解即可完成迁移操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值