近日,國外的商業軟體公司HashiCorp在官網宣布:不允許中國境内使用、部署和安裝該企業旗下的【企業版】産品和軟體。
PLEASE NOTE THAT THE SOFTWARE MAY NOT BE USED, DEPLOYED OR INSTALLED IN THE PEOPLE’S REPUBLIC OF CHINA.
HashiCorp旗下的知名的開源軟體有 Consul、Vagrant、Terraform等,
雖然在最後官方立馬對文章進行了修改和解釋,指出隻是因為國内管制,不允許使用其公司的 VAULT。但是通過這件事,還是建議已經在使用Consul的公司預防萬一,今天這篇文章就是專門來解決大家可能擔心的萬一出現,通過Nacos-Sync 把 Consul 平滑遷移到 Nacos。
遷移方案
方案一(雙注冊方案)
服務架構在過度期間将服務同時注冊到 Consul 和 Nacos。過度完去掉對 Consul 的注冊和消費。
方案二(Nacos-Sync同步方案)
Nacos-Sync是一個跨注冊中心服務同步元件,支援Zookeeper/Eureka/Consul/Nacos等注冊中心間服務同步和遷移。
下圖展示通過Nacos Sync 完成 Consul 到 Nacos 服務遷移的過程。隻需配置服務同步任務,過度期間服務雙向同步,新版本更新連到Nacos即可。
方案選型
雙注冊方案相對更穩定,但是需要多次更新釋出才能過度完成。相比之下Nacos-Sync侵入性更低,一次性遷移過度,也是我們推薦的一個方案。
Demo示範
下面我們通過一個簡單的 Demo 介紹一下怎麼用 Nacos-Sync 完成 Consul 到 Nacos 服務遷移。
環境準備
本例子包含 Spring-Cloud 将服務分别注冊到Consul、Nacos 兩個注冊中心互相同步示範
- Spring-Cloud 注冊到 Consul 的服務 同步到 Nacos
- Spring-Cloud 注冊到 Nacos 的服務 同步到 Consul
服務 | 版本 |
Consul | 1.7.3 |
Nacos | 1.2.1 |
Mysql | 5.7 |
Nacos-Sync | 0.3.7 |
本文示範上面的中間件服務均使用的是Docker Image,下面是docker安裝過程
1.Consul 啟動,這裡啟動4個Consul Agent,3個Server(會選舉出一個leader),1個Client.
#啟動第1個Server節點,叢集要求要有3個Server,将容器8500端口映射到主機8900端口,同時開啟管理界面 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 #檢視啟動後的第一個consul 容器IP docker exec -it consul1 cat /etc/hosts | grep 172 #啟動第2個Server節點,并加入叢集 docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 第一個容器ip #啟動第3個Server節點,并加入叢集 docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 第一個容器ip #啟動第4個Client節點,并加入叢集 docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 第一個容器ip
2.啟動Nacos server
$ docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.2.1
3.啟動Mysql
$ docker run --name nacos-sync-db -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=nacos_sync -p 3306:3306 -d mysql:5.7
4.啟動Nacos-Sync
下載下傳最新Nacos-Sync Release包,并解壓,進入解壓後的目錄,并修改conf/application.properties中的mysql配置
server.port=8081 server.servlet.context-path=/ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:mysql://127.0.0.1:3306/nacos_sync?characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root
5.執行啟動腳本
$ ./bin/startup.sh restart
Nacos-Sync 添加叢集
打開Nacos-Sync: localhost:8081
添加Consul叢集
1.選擇 叢集配置->新增叢集
添加Nacos叢集
2.選擇 叢集配置->新增叢集
添加完成效果
代碼示範
建立兩個Spring Cloud 應用分别向Consul和Nacos注冊服務,并且通過上面的Nacos-Sync完成Consul和Nacos注冊中心服務的互相同步.下面貼出一些關鍵代碼,具體代碼請參考:https://github.com/paderlol/nacos-sync-example
通過Consul注冊Spring Cloud服務
建立一個Controller服務
下面的Controller中, /hello是注冊在Consul的restful服務,/nacos-hello 是引用的在Nacos注冊的服務
@RestController public class HelloController { @GetMapping(value = "/hello") public String hello() { return "Hello World from Consul!"; } @Autowired private HelloService helloService; // 注冊在Nacos注冊中心的服務 @GetMapping(value = "/nacos-hello") public String hello2() { return helloService.hello(); } }
啟動consul-provider-cloud應用
運作 consul-provider-cloud工程下面com.paderlol.nacos.consul.ConsulProviderApplication類, 應用端口為18089
@SpringBootApplication @EnableFeignClients public class ConsulProviderApplication { public static void main(String[] args) { SpringApplication.run(ConsulProviderApplication.class, args); } // 引用Nacos同步過來的服務 @FeignClient(name = "nacos-provider-cloud") public interface HelloService { @RequestMapping(value = "/hello", method = RequestMethod.GET) String hello(); } }
驗證注冊
1.可以看到我們的服務已經在Consul注冊成功了
2.在浏覽器輸入: http://localhost:18089/hello 可以看到頁面傳回Hello World from Consul!
通過Nacos注冊Spring Cloud服務
建立一個Controller服務
下面的Controller中, /hello是Nacos本身的restful服務,/consul-hello 是引用的在Consul注冊的服務
@RestController public class HelloController { @Autowired private HelloService helloService; @GetMapping(value = "/consul-hello") public String hello() { return helloService.hello(); } @GetMapping(value = "/hello") public String hello2() { return "Hello World from Nacos!"; } }
啟動nacos-provider-cloud
運作 nacos-provider-cloud工程下面com.example.NacosCloudConsulConsumerApplication類, 應用端口為18088
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public 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(); } }
驗證注冊
1.可以看到我們的服務已經在Nacos注冊成功了
2.在浏覽器輸入: http://localhost:18088/hello 可以看到頁面傳回Hello World from Nacos!
添加同步任務
添加同步任務
1.打開Nacos-Sync 控制台,添加同步任務。
選擇 服務同步 -> 新增同步, 如圖
2.添加完成效果
打開Nacos 控制台 檢視同步結果
打開Nacos 控制台: http://localhost:8848/nacos
選擇 服務管理-> 服務清單 ,如圖
打開浏覽器: http://localhost:18088/consul-hello 如圖
打開Consul 控制台 檢視同步結果
打開Consul 控制台: http://localhost:8900/ui/dc1/services
打開浏覽器: http://localhost:18089/nacos-hello 如圖
總結
從上面的示範中,我們可以看到Nacos-Sync已經可以支援Nacos和Consul的Spring Cloud應用的雙向同步,可以很好的在Spring Cloud中支援Consul平滑遷移到Nacos應用.
稍微美中不足的暫時還沒支援一鍵批量遷移,現在的服務同步,基本都需要建立一個服務次元的服務,後面陸續也會支援,也歡迎社群的小夥伴一起參與共建。
尼采:那些殺不死你的,終将使你變得更強大!