全部产品
云市场

将 Spring Cloud 集群(多应用)平滑迁移到 EDAS

更新时间:2019-06-04 10:54:30

如果您的 Spring Cloud 集群(包含多个应用)已经部署在阿里云上,那么本文档将向您介绍如何将集群及集群中的所有应用平滑迁移到 EDAS 中,并实现基本的服务注册与发现。如果您的 Spring Cloud 集群还未部署到阿里云,请提交工单或联系 EDAS 技术支持人员为您提供完整的上云及迁移到 EDAS 方案。

迁移到 EDAS 的价值

  • EDAS 为应用部署提供了启动参数灵活配置、流程可视化、服务优雅上下线和分批发布等功能,让您的应用发布可配、可查、可控。

  • EDAS 提供了服务发现与配置管理功能,您无需再自行运维 Eureka、ZooKeeper、Consul 等中间件组件,可以直接使用 EDAS 提供的商业版服务发现与配置管理。

  • EDAS 控制台提供了统一的服务治理,目前支持查询发布和消费的服务详情。

  • EDAS 提供了动态扩、缩容功能,可以根据流量高峰和低谷实时地为您的应用扩容和缩容。

  • EDAS 提供了高级监控功能,除了支持基本的实例信息查询外,还支持微服务调用链查询、系统调用拓扑图、慢 SQL 查询等高级监控功能。

  • EDAS 提供限流降级功能,保证您的应用高可用。

  • EDAS 提供了全链路灰度功能,满足您的应用在迭代、更新时通过灰度进行小规模验证的需求。

什么是平滑迁移

如果您的 Spring Cloud 集群及应用已经部署到生产环境并处于正常运行状态中,此时想将集群迁移到 EDAS 享受完整的 EDAS 功能,那么在迁移过程中,保证业务的平稳运行不中断是第一要务,而保证应用平台运行不中断迁移到 EDAS 即为平滑迁移。

说明:如果您的集群尚未在生产环境中运行,或者您可以接受停机迁移,则没必要按照本文进行平滑迁移,可直接将应用在本地开发完再部署到 EDAS,详情请参见 将 Spring Cloud 应用托管到 EDAS

迁移流程

下图是一个比较典型的应用架构,根据迁移的先后顺序需要将迁移流程分为三步。

Spring Cloud 平滑迁移流程

  1. 必选)迁移应用

    迁移的应用一般都是无状态的,所以这一步是可以最先进行的。同时,本文将重点介绍如何迁移应用。

  2. (可选)迁移 SLB 或修改域名配置

    在应用迁移完成后,您还需要迁移 SLB 或修改域名配置。

    • SLB

      • 如果您的应用在迁移之前已经使用 SLB,在应用迁移后,可以复用该 SLB。您可以根据您的实际需求选择绑定 SLB 的策略,详情请参见SLB 绑定概述

      • 如果您的应用在迁移之前没有使用 SLB,建议您在迁移完入口应用(如上图所示的 API Gateway)后,为该应用创建并绑定一个新的 SLB。

      • 迁移应用的方案中,我们推荐您使用双注册和双订阅方案,以节约您的 ECS 成本。但如果由于某种原因(如原 ECS 端口被占用)不能复用之前的 ECS,则需要采用切流迁移方案,您需要添加新的 ECS用于迁移应用。在应用迁移完成后,参考上面描述的 SLB 的状态,选择复用 SLB 或创建 SLB 并绑定到应用。

    • 域名

      • 如果迁移后的应用可以复用 SLB,域名配置也无需修改。

      • 如果迁移后的应用需要创建新的 SLB 并绑定到应用,则需要在域名中添加新的 SLB 配置,详情请参见域名DNS修改,并删除原来不再使用的 SLB。

  3. (可选)迁移存储和消息队列

    • 如果你之前的应用已经部署在阿里云上,则存储和消息队列也使用了阿里云相关产品(如 RDS、MQ 等),则应用迁移完成后,之前的存储和消息队列无需迁移。
    • 如果您之前的应用不在阿里云上,请提交工单或联系 EDAS 技术支持人员为您提供完整的上云及迁移到 EDAS 方案。

本文将主要介绍如何迁移应用。如果您想通过一个 Demo 快速体验平滑迁移的过程,可下载 Demo,参考 Readme 运行一个迁移的样例。

迁移方案

迁移应用有两种方案,切流迁移、双注册和双订阅迁移方案。这两种方案都可以保证您的应用正常运行不中断的完成迁移。

说明:本文将主要介绍如果使用双注册和双订阅方案迁移应用。

切流迁移方案

使用 Spring Cloud Alibaba 将原有的服务注册中心切换到 Nacos。开发一套新的应用部署到 EDAS,最后通过 SLB 和域名配置来进行切流。

如果您选择此方案,那您可以参考将 Spring Cloud 应用托管到 EDAS开发应用,不需要再阅读迁移应用的后续内容,只需要关注本文末尾的迁移风险点和技术支持

双注册和双订阅迁移方案

双注册和双订阅迁移方案是指在应用迁移时同时接入两个注册中心(原有注册中心和 EDAS 注册中心)以保证已迁移的应用和未迁移的应用之间的相互调用。

通过双注册和双订阅平滑迁移应用的架构图如下:

双注册和双订阅平滑迁移架构

  • 已迁移的应用和未迁移的应用可以互相发现,从而实现互相调用,保证了业务的连续性。

  • 使用方式简单,只需要添加依赖,并修改一行代码,就可以实现双注册和双订阅。

  • 支持查看消费者服务调用列表的详情,实时地查看到迁移的进度。

  • 支持在不重启应用的情况下,动态地变更服务注册的策略和服务订阅的策略,只需要重启一次应用就可以完成迁移。

迁移第一个应用

步骤一:选择最先迁移的应用

建议是从最下层 Provider 开始迁移。但如果调用链路太复杂,比较难分析,也可以任意选一个应用进行迁移。选择完成后,即可参考下面的迁移步骤迁移第一个应用。

步骤二:在应用程序中添加依赖并修改配置

为了能将您原来的应用托管到 EDAS 中,您需要在您的应用程序中添加相关依赖并修改配置。

  1. pom.xml文件中添加 spring-cloud-starter-alibaba-nacos-discovery 依赖。

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    4. <version>{相应的版本}</version>
    5. </dependency>
  2. application.properties 中添加 nacos-server 的地址。

    1. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  3. 默认情况下 Spring Cloud 只支持在依赖中引入一个注册中心,当存在多个注册中心时,启动会报错。所以这里需要添加一个依赖 edas-sc-migration-starter,使 Spring Cloud 应用支持多注册。

    1. <dependency>
    2. <groupId>com.alibaba.edas</groupId>
    3. <artifactId>edas-sc-migration-starter</artifactId>
    4. <version>1.0.2</version>
    5. </dependency>
  4. Ribbon 是实现负载均衡的组件,为了使您的应用可以支持从多个注册中心订阅服务,你需要修改 Ribbon 配置。在应用启动的主类中,将 RibbonClients 默认配置为 MigrationRibbonConfiguration

    假设原有的应用主类启动代码如下:

    1. @SpringBootApplication
    2. public class ConsumerApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(ConsumerApplication.class, args);
    5. }
    6. }

    那么修改后的应用主类启动代码如下

    1. @SpringBootApplication
    2. @RibbonClients(defaultConfiguration = MigrationRibbonConfiguration.class)
    3. public class ConsumerApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(ConsumerApplication.class, args);
    6. }
    7. }

说明:您在本地修改应用或者应用部署到 EDAS 后,如果对应用有其它控制需求(如注册到哪些注册中心或从哪些注册中心订阅),可以通过 Spring Cloud Config 或 Nacos Config 进行动态的配置调整,无需重启应用,调整配置请参考动态调整服务注册和订阅方式

不过,这两种方式都需要在应用中添加配置管理依赖和修改配置的操作,使用 Spring Cloud Config 请参考开源文档,使用 Nacos Config 请参考实现配置管理

步骤三:将修改后的应用部署到 EDAS 中

您可以根据您的实际需求将应用部署到 ECS 集群或容器服务 Kubernetes 集群中,在部署时也可以选择通过控制台、工具等方式进行部属。详情请参见部署应用概述

  • 为了帮助您节约成本,建议您继续使用之前 ECS,但需要将 ECS 导入到 EDAS 中,详情请参见导入 ECS在导入 ECS 的时候如果提示需要转化后导入,请对重要的数据做好备份。

  • 如果需要创建新的 ECS、集群等资源,请确保在原有 VPC 内创建,以保证迁移前后的应用网络互通,顺利完成迁移。详情请参见创建资源

  • 在数据库、缓存、消息队列等产品中为新 ECS 配置 IP 白名单等,确保应用依赖的这些第三方组件可以正常访问。

结果验证

  1. 最重要的是观察业务本身是否正常。

  2. 查看服务订阅监控。

    如果您的应用开启了 Spring Boot Actuator 监控,那么可以访问 Actuator 来查看此应用订阅的各服务的 RibbonServerList 的信息。Actuator 地址如下:

    metaInfo 中的 serverGroup 字段代表了此节点来源于哪个服务注册中心。

    actuator 验证

迁移其它所有应用

依照迁移第一个应用的迁移步骤,依次将所有应用迁移到 EDAS。

清理迁移配置

迁移完成后,删除原有的注册中心的配置和迁移过程专用的依赖edas-sc-migration-starter,在业务量较小的时间分批重启应用。

edas-sc-migration-starter 是一个迁移专用的 starter,虽然长期使用对您业务的稳定性没有影响,但在 Ribbon 负载均衡实现方面有一定的局限性,推荐您在迁移完毕后清理掉,然后在业务量较小的时间分批重启应用。

动态调整服务注册和订阅方式

在完成迁移过程中,您可以通过 EDAS 配置管理功能动态变更服务注册和订阅方式。

动态调整服务订阅

默认的订阅策略是从所有注册中心订阅,并对数据做一些简单的聚合。

您可以通过 EDAS 的配置管理来修改spring.cloud.edas.migration.subscribes属性以便选择从哪几个注册中心订阅数据。

  1. spring.cloud.edas.migration.subscribes=nacos,eureka # 同时从 Eureka 和 Nacos 订阅服务
  2. spring.cloud.edas.migration.subscribes=nacos # 只从 Nacos 订阅服务

动态变更服务注册

默认的注册策略是注册到所有注册中心。

您可以通过 EDAS 的配置管理来调整服务注册中。

spring.cloud.edas.migration.registry.excludes属性来选择关闭指定的注册中心。

  1. spring.cloud.edas.migration.registry.excludes= #默认值为空,注册到所有的服务注册中心
  2. spring.cloud.edas.migration.registry.excludes=eureka #关闭 Eureka 的注册
  3. spring.cloud.edas.migration.registry.excludes=nacos,eureka #关闭 Nacos 和 Eureka 的注册

如果您想在应用运行时动态修改从注册到哪些注册中心,直接使用 Spring Cloud 配置管理功能在运行时修改此属性即可。

迁移问题咨询

如果在迁移过程中遇到异常情况,请加入钉钉群进行咨询。

说明:为了方便为您提供服务,请在申请加入钉钉群时备注公司名和阿里云账号。

钉钉群二维码