注冊(cè)中心 Consul 遷移到 Nacos


方案一(雙注冊(cè)方案)
服務(wù)框架在過(guò)度期間將服務(wù)同時(shí)注冊(cè)到 Consul 和 Nacos。過(guò)度完去掉對(duì) Consul 的注冊(cè)和消費(fèi)。

方案二(Nacos-Sync同步方案)
Nacos-Sync是一個(gè)跨注冊(cè)中心服務(wù)同步組件,支持Zookeeper/Eureka/Consul/Nacos等注冊(cè)中心間服務(wù)同步和遷移。
下圖展示通過(guò)Nacos ?Sync 完成 Consul 到 Nacos 服務(wù)遷移的過(guò)程。只需配置服務(wù)同步任務(wù),過(guò)度期間服務(wù)雙向同步,新版本升級(jí)連到Nacos即可。

方案選型
雙注冊(cè)方案相對(duì)更穩(wěn)定,但是需要多次升級(jí)發(fā)布才能過(guò)度完成。相比之下Nacos-Sync侵入性更低,一次性遷移過(guò)度,也是我們推薦的一個(gè)方案。
下面我們通過(guò)一個(gè)簡(jiǎn)單的 Demo 介紹一下怎么用 Nacos-Sync 完成 Consul 到 Nacos 服務(wù)遷移。
環(huán)境準(zhǔn)備
本例子包含 Spring-Cloud 將服務(wù)分別注冊(cè)到Consul、Nacos 兩個(gè)注冊(cè)中心互相同步演示
Spring-Cloud 注冊(cè)到 Consul 的服務(wù) 同步到 Nacos
Spring-Cloud 注冊(cè)到 Nacos 的服務(wù) 同步到 Consul
| 服務(wù) | 版本 |
| Consul | 1.7.3 |
| Nacos | 1.2.1 |
| Mysql | 5.7 |
| Nacos-Sync | 0.3.7 |
本文演示上面的中間件服務(wù)均使用的是Docker Image,下面是docker安裝過(guò)程
1.Consul 啟動(dòng),這里啟動(dòng)4個(gè)Consul Agent,3個(gè)Server(會(huì)選舉出一個(gè)leader),1個(gè)Client.
#啟動(dòng)第1個(gè)Server節(jié)點(diǎn),集群要求要有3個(gè)Server,將容器8500端口映射到主機(jī)8900端口,同時(shí)開(kāi)啟管理界面docker run -d --name=consul1 -p 8900:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui#查看啟動(dòng)后的第一個(gè)consul 容器IPdocker exec -it consul1 cat /etc/hosts | grep 172#啟動(dòng)第2個(gè)Server節(jié)點(diǎn),并加入集群docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 第一個(gè)容器ip#啟動(dòng)第3個(gè)Server節(jié)點(diǎn),并加入集群docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 第一個(gè)容器ip#啟動(dòng)第4個(gè)Client節(jié)點(diǎn),并加入集群docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 第一個(gè)容器ip
2.啟動(dòng)Nacos server
$ docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.2.13.啟動(dòng)Mysql
$ docker run --name nacos-sync-db -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=nacos_sync -p 3306:3306 -d mysql:5.74.啟動(dòng)Nacos-Sync
下載最新Nacos-Sync Release包,并解壓,進(jìn)入解壓后的目錄,并修改conf/application.properties中的mysql配置
server.port=8081server.servlet.context-path=/spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialectspring.jpa.hibernate.ddl-auto=updatespring.datasource.url=jdbc:mysql://127.0.0.1:3306/nacos_sync?characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=root
5.執(zhí)行啟動(dòng)腳本
$ ./bin/startup.sh restartNacos-Sync 添加集群
打開(kāi)Nacos-Sync: localhost:8081
添加Consul集群
1.選擇 集群配置->新增集群

添加Nacos集群
2.選擇 集群配置->新增集群

添加完成效果

創(chuàng)建兩個(gè)Spring Cloud 應(yīng)用分別向Consul和Nacos注冊(cè)服務(wù),并且通過(guò)上面的Nacos-Sync完成Consul和Nacos注冊(cè)中心服務(wù)的相互同步.下面貼出一些關(guān)鍵代碼,具體代碼請(qǐng)參考:https://github.com/paderlol/nacos-sync-example
通過(guò)Consul注冊(cè)Spring Cloud服務(wù)
創(chuàng)建一個(gè)Controller服務(wù)
下面的Controller中, /hello是注冊(cè)在Consul的restful服務(wù),/nacos-hello 是引用的在Nacos注冊(cè)的服務(wù)
@RestControllerpublic class HelloController {@GetMapping(value = "/hello")public String hello() {return "Hello World from Consul!";}@Autowiredprivate HelloService helloService;// 注冊(cè)在Nacos注冊(cè)中心的服務(wù)@GetMapping(value = "/nacos-hello")public String hello2() {return helloService.hello();}}
啟動(dòng)consul-provider-cloud應(yīng)用
運(yùn)行 consul-provider-cloud工程下面com.paderlol.nacos.consul.ConsulProviderApplication類, 應(yīng)用端口為18089
@SpringBootApplication@EnableFeignClientspublic class ConsulProviderApplication {public static void main(String[] args) {SpringApplication.run(ConsulProviderApplication.class, args);}// 引用Nacos同步過(guò)來(lái)的服務(wù)@FeignClient(name = "nacos-provider-cloud")public interface HelloService {@RequestMapping(value = "/hello", method = RequestMethod.GET)String hello();}}
驗(yàn)證注冊(cè)
1.可以看到我們的服務(wù)已經(jīng)在Consul注冊(cè)成功了

2.在瀏覽器輸入: http://localhost:18089/hello 可以看到頁(yè)面返回Hello World from Consul!
通過(guò)Nacos注冊(cè)Spring Cloud服務(wù)
創(chuàng)建一個(gè)Controller服務(wù)
下面的Controller中, /hello是Nacos本身的restful服務(wù),/consul-hello 是引用的在Consul注冊(cè)的服務(wù)
@RestControllerpublic class HelloController {@Autowiredprivate HelloService helloService;@GetMapping(value = "/consul-hello")public String hello() {return helloService.hello();}@GetMapping(value = "/hello")public String hello2() {return "Hello World from Nacos!";}}
啟動(dòng)nacos-provider-cloud
運(yùn)行 nacos-provider-cloud工程下面com.example.NacosCloudConsulConsumerApplication類, 應(yīng)用端口為18088
@SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class NacosCloudConsulConsumerApplication {public static void main(String[] args) {SpringApplication.run(NacosCloudConsulConsumerApplication.class, args);}@FeignClient(name = "consul-provider-cloud")public interface HelloService {@RequestMapping(value = "/hello", method = RequestMethod.GET)String hello();}}
驗(yàn)證注冊(cè)
1.可以看到我們的服務(wù)已經(jīng)在Nacos注冊(cè)成功了

2.在瀏覽器輸入: http://localhost:18088/hello 可以看到頁(yè)面返回Hello World from Nacos!
添加同步任務(wù)
添加同步任務(wù)
1.打開(kāi)Nacos-Sync 控制臺(tái),添加同步任務(wù)。
選擇 服務(wù)同步 -> 新增同步, 如圖


2.添加完成效果

打開(kāi)Nacos 控制臺(tái) 查看同步結(jié)果
打開(kāi)Nacos 控制臺(tái): http://localhost:8848/nacos
選擇 服務(wù)管理-> 服務(wù)列表 ,如圖

打開(kāi)瀏覽器: http://localhost:18088/consul-hello ?如圖

打開(kāi)Consul 控制臺(tái) 查看同步結(jié)果
打開(kāi)Consul 控制臺(tái): http://localhost:8900/ui/dc1/services

打開(kāi)瀏覽器: http://localhost:18089/nacos-hello ?如圖

從上面的演示中,我們可以看到Nacos-Sync已經(jīng)可以支持Nacos和Consul的Spring Cloud應(yīng)用的雙向同步,可以很好的在Spring Cloud中支持Consul平滑遷移到Nacos應(yīng)用.
稍微美中不足的暫時(shí)還沒(méi)支持一鍵批量遷移,現(xiàn)在的服務(wù)同步,基本都需要建立一個(gè)服務(wù)維度的服務(wù),后面陸續(xù)也會(huì)支持,也歡迎社區(qū)的小伙伴一起參與共建。
尼采:那些殺不死你的,終將使你變得更強(qiáng)大!
【墻裂推薦】
最近熱門內(nèi)容回顧? ?#技術(shù)人系列

下方二維碼關(guān)注我

互聯(lián)網(wǎng)草根,堅(jiān)持分享技術(shù)、創(chuàng)業(yè)、產(chǎn)品等心得和總結(jié)~

點(diǎn)擊“閱讀原文”,領(lǐng)取 2020 年最新免費(fèi)技術(shù)資料大全
