vlambda博客
学习文章列表

如何平滑将注册中心从Eureka迁移到Nacos?

1.背景

Nacos与Eureka相比,Nacos的优点非常明显,当然首选Nacos作为注册中心。本文主要介绍如何从Eureka无缝平滑迁移到Nacos注册中心,业务方应用改动最小,业务应用改造一次完成迁移。

2.方案设计

2.1 业务应用多注册到Nacos和Eureka

Spring Cloud应用默认不支持启动时双向注册,但是阿里商业版上云edas-sc-migration-starter组件支持。可以采用如下的方式引入依赖实现多注册和订阅。

 
   
   
 
  1. <!-- https://mvnrepository.com/artifact/com.alibaba.edas/edas-sc-migration-starter -->

  2. <dependency>

  3. <groupId>com.alibaba.edas</groupId>

  4. <artifactId>edas-sc-migration-starter</artifactId>

  5. <version>1.0.2</version>

  6. </dependency>

也就是引入对应的组件,当应用启动的时候同时向Eureka和Nacos实现双向注册。更多的实现细节和使用细节本文将不进行展开。

 如上图所示,如果只把旧应用只改一部分,会出现只有改造的应用能调到新应用。未改造的应用会出现调不到新应用的情况。即,需要如下图所示的方式,旧应用全部升级改造为双注册到注册中心,才可以支持。

如何平滑将注册中心从Eureka迁移到Nacos?

但是旧应用无法保证同一时刻全部升级改造为同时注册,因此该方案论证失败。

2.2 Nacos Sync方案

Nacos Sync 是一个支持多种注册中心的同步组件,基于 SpringBoot 开发框架,数据层采用 Spring Data JPA,遵循了标准的 JPA 访问规范,支持多种数据源存储,默认使用 Hibernate 实现,更加方便的支持表的自动创建更新。但目前最新版本是如下图所示。 

如何平滑将注册中心从Eureka迁移到Nacos?

跟Nacos Sync项目的负责人沟通过,目前也支持Nacos与Eureka之间双向同步,至于怎么用优缺点怎么样本文将不进行展开。

2.3 注册中心服务端双向同步

2.3.1 方案设计

设计思路是注册中心服务端进行双向同步,做到微服务端完全无侵入,可以随业务迭代逐步完成升级和迁移。改造Eureka Server,Eureka Server引入同步组件实现Nacos和Eureka之间实现双向同步,如下图所示:

如何平滑将注册中心从Eureka迁移到Nacos?

2.3.2 迁移步骤

迁移步骤如下:


  • 1.部署Nacos Server集群用于服务注册与发现


  • 2.在线动态扩容Eureka Server,替换其中的1-2两台Eureka Server。


  • 3.逐渐改造旧应用,只需将新旧应用注册到Nacos上


  • 4.等旧应用全部改造完毕,下线Eureka Server即可。


这样方案的优点,如下:


  • 1.新应用直接注册到Nacos上,不需要同时注册到Eureka和Nacos上

  • 2.旧应用直接改造(引入相关starter即可)注册到Nacos上即可,不需要同时注册到Nacos和Eureka上

  • 3.迁移成本很低,旧应用只需改造一次(所谓的改造即引入新的Starter,修改配置),等全部旧应用迁移完毕,直接下线Eureka Server。


3.迁移落地

3.1 组件开发

开发一个Spring Boot Starter,加入到Eureka Server或Nacos Server中可以实现双向注册。

3.2 spring-cloud-nacos组件介绍


  • spring-cloud-nacos主要由 何鹰和瞿礼贡献,

  • Nacos Plus在Nacos上做加法,Nacos client默认是支持安全控制的可以参考阿里云商业版配置中心ACM集成方式 https://github.com/alibaba/spring-cloud-alibaba/wiki/ACM 以及 spring cloud alibaba 配置项 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md 但是开源的Nacos并不含有安全控制模块,在Nacos plus里我们新增了兼容默认Nacos client的安全控制功能。

可以查看:https://github.com/inacos/nacos

如何平滑将注册中心从Eureka迁移到Nacos?

4.实现迁移落地

按如下,迁移步骤进行迁移。具体细节在本文省略。1.部署Nacos Server集群用于服务注册与发现 2.在线动态扩容一台Eureka Server 3.逐渐改造旧应用,只需将新旧应用注册到Nacos上 4.等旧应用全部改造完毕,下线Eureka Server即可。

下面将在本地进行测试说明,用到的演示说明列表如下所示:

服务 说明
Eureka注册中心(http://eureka.springcloud.cn/) 模拟生产上的Eureka注册中心
本地基于源码方式启动一个Nacos实例 模拟生产上新建的Nacos
同步服务(本地基于Eureka Server扩展启动的同步服务) 模拟生产上启动了一个Nacos与Eureka之间双向同步的服务
本地启动一个服务注册到(http://eureka.springcloud.cn/) 验证从eureka同步服务到nacos
本地启动一个服务注册到Nacos 验证从nacos同步服务到Eureka上

4.1 模拟生产的注册中心

如何平滑将注册中心从Eureka迁移到Nacos?

4.2 基于源代码方式启动Nacos

基于Nacos的最新Master代码,本地IDEA设置环境变量-Dnacos.standalone=true,启动Nacos,如下所示:

如何平滑将注册中心从Eureka迁移到Nacos?

2.打开浏览器访问 http://localhost:8848/nacos/index.html,输入用户名和密码(均为nacos)登录。 

如何平滑将注册中心从Eureka迁移到Nacos?

4.3 启动同步服务测试

4.3.1 搭建同步服务

  1. 示例工程如spring-cloud-nacos-eureka-proxy-example所示,在一个Eureka Server中引入如下的pom依赖:

 
   
   
 
  1. <dependencies>

  2. <dependency>

  3. <groupId>org.springframework.cloud</groupId>

  4. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

  5. </dependency>

  6. <dependency>

  7. <groupId>org.springframework.boot</groupId>

  8. <artifactId>spring-boot-starter-actuator</artifactId>

  9. </dependency>

  10. <!-- 引入NacosEureka之间同步的Starter

  11. <dependency>

  12. <groupId>net.nacos</groupId>

  13. <artifactId>spring-cloud-nacos-eureka-proxy</artifactId>

  14. <version>1.0.0</version>

  15. </dependency>

  16. <dependency>

  17. <groupId>com.alibaba.nacos</groupId>

  18. <artifactId>nacos-client</artifactId>

  19. <version>1.1.3</version>

  20. </dependency>

  21. </dependencies>

  1. 在application.properties配置如下信息

 
   
   
 
  1. server.port=8761

  2. spring.application.name=eureka-proxy


  3. spring.cloud.nacos.discovery.serverAddr=localhost:8848


  4. eureka.client.serviceUrl.defaultZone=http://eureka.springcloud.cn/eureka/

  5. #eureka.client.fetchRegistry=false

  6. #eureka.client.registerWithEureka=false

  7. eureka.instance.preferIpAddress=true


  8. eureka.server.enable-self-preservation=false

4.3.2 启动服务

启动同步服务,访问Nacos页面发现已经把Eureka上面的服务同步到Nacos,如下所示:

如何平滑将注册中心从Eureka迁移到Nacos?

说明,因为是从公网Eureka上同步过来的服务列表,部分服务不在本地。因此Naocs将会从服务列表中踢除。但不影响验证功能。

4.3.3 验证从Eureka同步到Nacos

启动一个moss-sample-2.1.x的服务只

注册到 http://eureka.springcloud.cn/,立即同步到Nacos上,可以自行验证。

4.3.4 验证从Nacos同步到Eureka

启动一个服务一个服务只注册到Nacos上,发现立即同步到 http://eureka.springcloud.cn/上,如下图所示: 

5.总结

本文从迁移的方案入手,进行论证如何将注册中心从Eureka迁移到Nacos。如何在迁移的过程中有任何疑问,欢迎沟通交流。