注册中心需要从Eureka无缝平滑迁移到Nacos注册中心,业务方尽量改动最小,一次性搞定。
Spring Cloud应用默认不支持启动时双向注册,但是阿里商业版上云组件支持。 也就是引入对应的组件,当应用启动的时候同时向Eureka和Nacos实现双向注册。
如上图所示,如果只把旧应用只改一部分,会出现只有改造的应用能调到新应用。未改造的应用会出现调不到新应用的情况。即,需要如下图所示的方式,旧应用全部升级改造为双注册到注册中心,才可以支持。
但是旧应用无法保证同一时刻全部升级改造为同时注册,因此该方案论证失败。
Nacos Sync 是一个支持多种注册中心的同步组件,基于 SpringBoot 开发框架,数据层采用 Spring Data JPA,遵循了标准的 JPA 访问规范,支持多种数据源存储,默认使用 Hibernate 实现,更加方便的支持表的自动创建更新。但目前最新版本是,
0.4.0 规划介绍才支持Eureka与Nacos双向同步。下面表格介绍了目前支持的几种同步类型,并且说明了在 Dubbo 和 Spring Cloud 下是否支持同步,表格中列举的几种注册中心,无论单向还是双向同步都是在和 Nacos 进行交互。
从上图中可以知道,目前不支持Nacos与Eureka双向同步。不支持双向同步,不建议使用。
设计思路是注册中心服务端进行双向同步,做到微服务端完全无侵入,可以随业务迭代逐步完成升级和迁移。改造Eureka Server,Eureka Server引入同步组件实现Nacos和Eureka之间实现双向同步,如下图所示:
迁移步骤如下: 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.。
- 4.迁移成本很低,旧应用只需改造一次(所谓的改造即引入新的Starter,修改配置),等全部迁移完毕,直接下线Eureka Server。
方案 | 优点 | 缺点 | 是否推荐 |
---|---|---|---|
由Eureka进行双向同步 | 1.业务方应用只需改造一次 2.即使旧应用没有时间改造,依然注册到Eureka上也可以服务发现Nacos上的新服务或者迁移过去的新服务 | 需要改造注册中心 | 推荐 |
多注册到Nacos和Eureka | 就是不需要改造注册中心,由业务方应用启动双向注册 | 1.增加旧业务方应用的改造成本。2. 旧应用需要多次改造 当下线Eureka Server时,需要保证全部旧应用全部已经注册到Nacos上。3.Eureka Server下线瞬间,只允许从Nacos上进行服务与发现调用 | 不推荐 |
组件采用SpringBoot自动配置方式构建,需要在pom文件中添加组件的依赖,并且在项目中添加Nacos的配置文件,Spring Boot在启动时,会自动加载配置。
- Eureka注册中心
<dependency>
<groupId>net.nacos</groupId>
<artifactId>spring-cloud-nacos-eureka-proxy</artifactId>
<version>1.0.0</version>
</dependency>
- Spring Cloud Config配置中心
<dependency>
<groupId>net.nacos</groupId>
<artifactId>spring-cloud-nacos-config-proxy</artifactId>
<version>1.0.0</version>
</dependency>
- application.properties配置文件
spring.cloud.nacos.config.serverAddr=localhost:8848
核心代码主要是NacosSynchronizer.java和EurekaSynchronizer.java,请自行阅读。 github地址:https://github.com/inacos/spring-cloud-nacos
按如下,迁移步骤进行迁移。具体细节在本文省略。 1.部署Nacos Server集群用于服务注册与发现 2.在线动态扩容Eureka Server,替换其中的1-2两台Eureka Server。 3.逐渐改造旧应用,只需将新旧应用注册到Nacos上 4.等旧应用全部改造完毕,下线Eureka Server即可。
在Eureka Server中引入
相对于注册中心平滑迁移来说,配置中心的迁移简单得多。多亏了Spring Cloud优秀的设计,其灵活扩展能力极强,我们只用将Spring Cloud Config底层存储切换到Nacos即可(参考NacosEnvironmentRepository),将Spring Cloud Config变成Nacos的一个Proxy。
具体代码参考spring-cloud-nacos-config-proxy-example项目,只需在原有的Spring Cloud Config添加依赖即可:
<dependency>
<groupId>net.nacos</groupId>
<artifactId>spring-cloud-nacos-config-proxy</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
启动spring-cloud-nacos-config-proxy-example
假设微服务名为demo,启动参数为:
--spring.cloud.config.uri=http://localhost:8888
--spring.application.name=demo
--spring.cloud.config.profile=dev
--spring.cloud.config.fail-fast=true
那么我们的spring-cloud-nacos-config-proxy-example会从Nacos读取DataId为application.properties、application-dev.properties、demo.properties、demo-dev.properties四个配置,并且优先级由低至高,符合Spring Cloud Config规范。
如果想在Nacos里使用yml文件配置,只需添加spring-cloud-nacos-config-proxy-example配置:
# 默认properties
spring.cloud.nacos.config.fileExtension=yml