Spring Boot 单体应用升级 Spring Cloud 微服务

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Spring Boot 单体应用升级 Spring Cloud 微服务

作者:刘军

Spring Cloud 是在 Spring Boot 之上构建的一套微服务生态体系,包括服务发现、配置中心、限流降级、分布式事务、异步消息等,因此通过增加依赖、注解等简单的四步即可完成 Spring Boot 应用到 Spring Cloud 升级。


*Spring Cloud Alibaba (SCA) 官网正式上线: sca.aliyun.com


Spring Boot 应用升级为 Spring Cloud


以下是应用升级 Spring Cloud 的完整步骤。


第一步:添加 Spring Cloud 依赖

首先,为应用添加 Spring Cloud 与 Spring Cloud Alibaba 依赖。注意根据当前应用 Spring Boot 版本选择合适的 Spring Cloud 版本,具体参见版本映射表[1]


<properties>
    <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
    <spring-cloud.version>2022.0.0</spring-cloud.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <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>
    <!-- Nacos 服务发现 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- 服务发现:OpenFeign服务调用 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  <!-- 服务发现:OpenFeign服务调用 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>


以上我们添加了服务注册发现、OpenFeign 等依赖。


第二步:添加配置

在应用 application.yml 或者 application.properties 文件中增加以下配置项,设置应用名、注册中心地址。


application.yml:


spring:
  application:
    #项目名称必填,在注册中心唯一
    #最好和之前域名规范、kubernetes service名等保持一致(会作为调用与负载均衡依据)
    name: service-provider
  cloud: 
    nacos: 
      discovery: #启用 spring cloud nacos discovery
        server-addr: 127.0.0.1:8848


application.properties:


#项目名称必填,在注册中心唯一
#最好和之前域名规范、kubernetes service名等保持一致(会作为调用与负载均衡依据)
spring.application.name=service-provider
 #启用 spring cloud nacos discovery
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848


第三步:启动类增加注解

启动类增加 EnableDiscoveryClient EnableFeignClients 注解,启动服务地址自动注册与发现。


@SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class ProviderApplication {    public static void main(String[] args) {        SpringApplication.run(ProviderApplication.class, args);    }}


第四步:调整服务调用方式


🔔 注意!

1. 为了保证平滑升级,请确保下游应用完成 Spring Cloud 改造并在注册中心注册服务后再进行调用方式改造。


2. RestTemplate/FeignClient 默认发起调用的 hostname (示例中的 service-provider)是对端 Spring Cloud 应用名。因此,为了保证尽可能少的改造量,改造过程中设置的应用名 spring.name=service-provider 最好和之前的命名规范保持一致。比如:


  • 如果之前有自定义域名,则和域名定义保持一致
  • 如果之前用的 Kubernetes Service,则和 Service Name 保持一致


1. RestTemplate 模式

为之前的 RestTemplate Bean 添加 @LoadBlanced 注解,使得 RestTemplate 接入服务发现与负载均衡:


@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}


其它原有 RestTemplate 发起调用的代码保持不变,只需调整 hostname 即可,如下所示。


@RestController
 public class TestController {
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping(value = "/echo-rest/{str}")
    public String rest(@PathVariable String str) {
        return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
    }
}


2. FeignClient 模式

使用 @FeignClient 注解将 EchoService 这个接口包装成一个 FeignClient,属性 name 对应对端应用名 spring.name=service-provider。


//@FeignClient(name = "service-provider", url="http://service.example.com/") 
@FeignClient(name = "service-provider")
public interface EchoService {
    @GetMapping(value = "/echo/{str}")
    String echo(@PathVariable("str") String str);
}


将 EchoService 作为标准 bean 注入,即可对远端服务发起请求了。


@RestController
 public class TestController {
    @Autowired
    private EchoService echoService;
    @GetMapping(value = "/echo-feign/{str}")
    public String feign(@PathVariable String str) {
        return echoService.echo(str);
    }
}


3. HtClient、自定义 HTTP 访问工具等

对于使用 HttpClient 或者自行封装 http 调用工具的用户,建议统一改造为以上 1、2 两种调用模式之一。


参考资料


完整示例源码

基于 Spring Boot 构建的应用架构变化多样,比如可能是以下一些常用架构的任意一种,但不论哪种架构,升级 Spring Cloud 的大致改造方式都是类似的(都可以转为基于 Nacos 注册中心的地址发现与负载均衡)。


  • 基于 DNS 自定义域名,服务间的通过域名调用实现负载均衡
  • 基于 SLB 的中心化流量转发,调用直接转发到 SLB,由 SLB 实现在服务间实现流量转发
  • 基于 Kubernetes Service 微服务体系,依赖 Kubernetes ClusterIP 等实现负载均衡与调用转发


在此,我们以 DNS 自定义域名架构为例,提供了一个 Spring Boot 到 Spring Cloud 升级改造的完整示例,升级前后的应用架构图如下。具体可参见 Github 源码链接[2]


升级前 SpringBoot 架构 👆


升级后 SpringCloud 架构 👆


Spring Boot 与 Spring Cloud Alibaba 版本对应关系

请根据您使用的 Spring Boot 版本,选择兼容的 Spring Cloud Alibaba 版本:


Spring Boot Version Spring Cloud Alibaba Version Spring Cloud Version
3.0.2 2022.0.0.0 Spring Cloud 2022.0.0
3.0.2 2022.0.0.0-RC2 Spring Cloud 2022.0.0
3.0.0 2022.0.0.0-RC1 Spring Cloud 2022.0.0
2.6.13 2021.0.5.0 Spring Cloud 2021.0.5
2.6.11 2021.0.4.0 Spring Cloud 2021.0.4
2.6.3 2021.0.1.0 Spring Cloud 2021.0.1
2.4.2 2021.1 Spring Cloud 2020.0.1
2.3.12.RELEASE 2.2.10-RC1 Spring Cloud Hoxton.SR12
2.3.12.RELEASE 2.2.9.RELEASE Spring Cloud Hoxton.SR12
2.3.12.RELEASE 2.2.8.RELEASE Spring Cloud Hoxton.SR12
2.3.12.RELEASE 2.2.7.RELEASE Spring Cloud Hoxton.SR12
2.3.2.RELEASE 2.2.6.RELEASE Spring Cloud Hoxton.SR9
2.2.5.RELEASE 2.2.1.RELEASE Spring Cloud Hoxton.SR3
2.2.X.RELEASE 2.2.0.RELEASE Spring Cloud Hoxton.RELEASE
2.1.13.RELEASE 2.1.4.RELEASE Spring Cloud Greenwich.SR6
2.1.X.RELEASE 2.1.2.RELEASE Spring Cloud Greenwich
2.0.X.RELEASE 2.0.4.RELEASE(停止维护,建议升级) Spring Cloud Finchley
1.5.X.RELEASE 1.5.1.RELEASE(停止维护,建议升级) Spring Cloud Edgware


Spring Cloud Alibaba Starters 列表与使用手册

  • spring-cloud-starter-alibaba-nacos-discovery[3]
  • spring-cloud-starter-alibaba-nacos-config[4]
  • spring-cloud-starter-alibaba-nacos-sentinel[5]
  • spring-cloud-starter-alibaba-nacos-rocketmq[6]
  • spring-cloud-starter-alibaba-nacos-seata[7]


Spring Cloud Alibaba 集成的组件版本

每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示:


Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Version Dubbo Version Seata Version
2022.0.0.0 1.8.6 2.2.1 4.9.4 ~ 1.7.0
2022.0.0.0-RC2 1.8.6 2.2.1 4.9.4 ~ 1.7.0-native-rc2
2021.0.5.0 1.8.6 2.2.0 4.9.4 ~ 1.6.1
2.2.10-RC1 1.8.6 2.2.0 4.9.4 ~ 1.6.1
2022.0.0.0-RC1 1.8.6 2.2.1-RC 4.9.4 ~ 1.6.1
2.2.9.RELEASE 1.8.5 2.1.0 4.9.4 ~ 1.5.2
2021.0.4.0 1.8.5 2.0.4 4.9.4 ~ 1.5.2
2.2.8.RELEASE 1.8.4 2.1.0 4.9.3 ~ 1.5.1
2021.0.1.0 1.8.3 1.4.2 4.9.2 ~ 1.4.2
2.2.7.RELEASE 1.8.1 2.0.3 4.6.1 2.7.13 1.3.0
2.2.6.RELEASE 1.8.1 1.4.2 4.4.0 2.7.8 1.3.0
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE 1.8.0 1.4.1 4.4.0 2.7.8 1.3.0
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE 1.8.0 1.3.3 4.4.0 2.7.8 1.3.0
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE 1.7.1 1.2.1 4.4.0 2.7.6 1.2.0
2.2.0.RELEASE 1.7.1 1.1.4 4.4.0 2.7.4.1 1.0.0
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE 1.7.0 1.1.4 4.4.0 2.7.3 0.9.0
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE 1.6.3 1.1.1 4.4.0 2.7.3 0.7.1


相关链接:

[1] 版本映射表

https://sca.aliyun.com/zh-cn/docs/next/best-practice/spring-boot-to-spring-cloud/

[2] Github 源码链接

https://github.com/spring-cloud-alibaba-group/springboot-transfer-to-springcloud

[3]spring-cloud-starter-alibaba-nacos-discovery

https://sca.aliyun.com/zh-cn/docs/next/user-guide/nacos/quick-start/#%E6%8E%A5%E5%85%A5-nacos-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0

[4] spring-cloud-starter-alibaba-nacos-config

https://sca.aliyun.com/zh-cn/docs/next/user-guide/nacos/quick-start/#%E6%8E%A5%E5%85%A5-nacos-%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83

[5] spring-cloud-starter-alibaba-nacos-sentinel

https://sca.aliyun.com/zh-cn/docs/next/user-guide/sentinel/quick-start/

[6] spring-cloud-starter-alibaba-nacos-rocketmq

https://sca.aliyun.com/zh-cn/docs/next/user-guide/rocketmq/quick-start/

[7] spring-cloud-starter-alibaba-nacos-seata

https://sca.aliyun.com/zh-cn/docs/next/user-guide/seata/quick-start/

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
27天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
49 2
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
143 1
|
17天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
15天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
15天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
33 2
|
29天前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
30天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
27天前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
71 1
|
30天前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
56 2