# spring-cloud-nacos
**Repository Path**: rit/spring-cloud-nacos
## Basic Information
- **Project Name**: spring-cloud-nacos
- **Description**: Spring Cloud集成Nacos对其增加扩展支持
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-08-13
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 如何平滑迁移到Nacos?
# 如何平滑将注册中心从Eureka迁移到Nacos?
## 1.背景
注册中心需要从Eureka无缝平滑迁移到Nacos注册中心,业务方尽量改动最小,一次性搞定。
## 2.方案设计
### 2.1 业务应用多注册到Nacos和Eureka
Spring Cloud应用默认不支持启动时双向注册,但是阿里商业版上云组件支持。
也就是引入对应的组件,当应用启动的时候同时向Eureka和Nacos实现双向注册。

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

>但是旧应用无法保证同一时刻全部升级改造为同时注册,因此该方案论证失败。
### 2.2 Nacos Sync方案
Nacos Sync 是一个支持多种注册中心的同步组件,基于 SpringBoot 开发框架,数据层采用 Spring Data JPA,遵循了标准的 JPA 访问规范,支持多种数据源存储,默认使用 Hibernate 实现,更加方便的支持表的自动创建更新。但目前最新版本是,

0.4.0 规划介绍才支持Eureka与Nacos双向同步。下面表格介绍了目前支持的几种同步类型,并且说明了在 Dubbo 和 Spring Cloud 下是否支持同步,表格中列举的几种注册中心,无论单向还是双向同步都是在和 Nacos 进行交互。

>从上图中可以知道,目前不支持Nacos与Eureka双向同步。不支持双向同步,不建议使用。
### 2.3 注册中心服务端双向同步
#### 2.3.1 方案设计
设计思路是注册中心服务端进行双向同步,做到微服务端完全无侵入,可以随业务迭代逐步完成升级和迁移。改造Eureka Server,Eureka Server引入同步组件实现Nacos和Eureka之间实现双向同步,如下图所示:

##### 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.。
* 4.迁移成本很低,旧应用只需改造一次(所谓的改造即引入新的Starter,修改配置),等全部迁移完毕,直接下线Eureka Server。
### 2.4 三种方案的对比
| 方案 | 优点 | 缺点 |是否推荐
| --- | --- | --- |---
|由Eureka进行双向同步|1.业务方应用只需改造一次 2.即使旧应用没有时间改造,依然注册到Eureka上也可以服务发现Nacos上的新服务或者迁移过去的新服务 |需要改造注册中心 |推荐
|多注册到Nacos和Eureka| 就是不需要改造注册中心,由业务方应用启动双向注册 | 1.增加旧业务方应用的改造成本。2. 旧应用需要多次改造 当下线Eureka Server时,需要保证全部旧应用全部已经注册到Nacos上。3.Eureka Server下线瞬间,只允许从Nacos上进行服务与发现调用|不推荐
## 3.迁移落地
### 3.1 组件开发
组件采用SpringBoot自动配置方式构建,需要在pom文件中添加组件的依赖,并且在项目中添加Nacos的配置文件,Spring Boot在启动时,会自动加载配置。
* Eureka注册中心
```
net.nacos
spring-cloud-nacos-eureka-proxy
1.0.0
```
* Spring Cloud Config配置中心
```
net.nacos
spring-cloud-nacos-config-proxy
1.0.0
```
* application.properties配置文件
```
spring.cloud.nacos.config.serverAddr=localhost:8848
```
### 3.3 spring-cloud-nacos组件介绍
核心代码主要是NacosSynchronizer.java和EurekaSynchronizer.java,请自行阅读。
github地址:https://github.com/inacos/spring-cloud-nacos

## 4.实现迁移落地
按如下,迁移步骤进行迁移。具体细节在本文省略。
1.部署Nacos Server集群用于服务注册与发现
2.在线动态扩容Eureka Server,替换其中的1-2两台Eureka Server。
3.逐渐改造旧应用,只需将新旧应用注册到Nacos上
4.等旧应用全部改造完毕,下线Eureka Server即可。
### 4.1 在线扩容Eureka Server
在Eureka Server中引入
## 5.总结
# 如何平滑将配置中心从Spring Cloud Config迁移到Nacos?
相对于注册中心平滑迁移来说,配置中心的迁移简单得多。多亏了Spring Cloud优秀的设计,其灵活扩展能力极强,我们只用将Spring Cloud Config底层存储切换到Nacos即可(参考NacosEnvironmentRepository),将Spring Cloud Config变成Nacos的一个Proxy。
具体代码参考spring-cloud-nacos-config-proxy-example项目,只需在原有的Spring Cloud Config添加依赖即可:
```
net.nacos
spring-cloud-nacos-config-proxy
1.0.0
com.alibaba.nacos
nacos-client
1.1.3
```
启动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
```