作者 l 張龍
來源 l Hollis(ID:hollischuang)
PLEASE NOTE THAT THE SOFTWARE MAY NOT BE USED, DEPLOYED OR INSTALLED IN THE PEOPLE’S REPUBLIC OF CHINA.HashiCorp旗下的知名的開源軟件有 Consul知牌、Vagrant祈争、Terraform等,雖然在最后官方立馬對文章進行了修改和解釋,指出只是因為國內(nèi)管制,不允許使用其公司的 VAULT角寸。但是通過這件事菩混,還是建議已經(jīng)在使用Consul的公司預(yù)防萬一,今天這篇文章就是專門來解決大家可能擔心的萬一出現(xiàn),通過Nacos-Sync 把 Consul 平滑遷移到 Nacos。遷移方案
方案一(雙注冊方案)
服務(wù)框架在過度期間將服務(wù)同時注冊到 Consul 和 Nacos扁藕。過度完去掉對 Consul 的注冊和消費沮峡。
方案二(Nacos-Sync同步方案)
Nacos-Sync是一個跨注冊中心服務(wù)同步組件,支持Zookeeper/Eureka/Consul/Nacos等注冊中心間服務(wù)同步和遷移亿柑。
下圖展示通過Nacos Sync 完成 Consul 到 Nacos 服務(wù)遷移的過程邢疙。只需配置服務(wù)同步任務(wù),過度期間服務(wù)雙向同步,新版本升級連到Nacos即可疟游。
方案選型
雙注冊方案相對更穩(wěn)定呼畸,但是需要多次升級發(fā)布才能過度完成。相比之下Nacos-Sync侵入性更低颁虐,一次性遷移過度蛮原,也是我們推薦的一個方案。
Demo演示
下面我們通過一個簡單的 Demo 介紹一下怎么用 Nacos-Sync 完成 Consul 到 Nacos 服務(wù)遷移另绩。
環(huán)境準備
本例子包含 Spring-Cloud 將服務(wù)分別注冊到Consul儒陨、Nacos 兩個注冊中心互相同步演示
Spring-Cloud 注冊到 Consul 的服務(wù) 同步到 Nacos
Spring-Cloud 注冊到 Nacos 的服務(wù) 同步到 Consul
| 服務(wù) | 版本 |
| Consul | 1.7.3 |
| Nacos | 1.2.1 |
| Mysql | 5.7 |
| Nacos-Sync | 0.3.7 |
本文演示上面的中間件服務(wù)均使用的是Docker Image,下面是docker安裝過程
1.Consul 啟動,這里啟動4個Consul Agent,3個Server(會選舉出一個leader),1個Client.
#啟動第1個Server節(jié)點板熊,集群要求要有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節(jié)點干签,并加入集群
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 第一個容器ip
#啟動第3個Server節(jié)點,并加入集群
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 第一個容器ip
#啟動第4個Client節(jié)點拆撼,并加入集群
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.執(zhí)行啟動腳本
$ ./bin/startup.sh restart
Nacos-Sync 添加集群
打開Nacos-Sync: localhost:8081
添加Consul集群
1.選擇 集群配置->新增集群
添加Nacos集群
2.選擇 集群配置->新增集群
添加完成效果
代碼演示
創(chuàng)建兩個Spring Cloud 應(yīng)用分別向Consul和Nacos注冊服務(wù),并且通過上面的Nacos-Sync完成Consul和Nacos注冊中心服務(wù)的相互同步.下面貼出一些關(guān)鍵代碼,具體代碼請參考:https://github.com/paderlol/nacos-sync-example
通過Consul注冊Spring Cloud服務(wù)
創(chuàng)建一個Controller服務(wù)
下面的Controller中, /hello是注冊在Consul的restful服務(wù),/nacos-hello 是引用的在Nacos注冊的服務(wù)
@RestController
public class HelloController {
@GetMapping(value = "/hello")
public String hello() {
return "Hello World from Consul!";
}
@Autowired
private HelloService helloService;
// 注冊在Nacos注冊中心的服務(wù)
@GetMapping(value = "/nacos-hello")
public String hello2() {
return helloService.hello();
}
}
啟動consul-provider-cloud應(yīng)用
運行 consul-provider-cloud工程下面com.paderlol.nacos.consul.ConsulProviderApplication類, 應(yīng)用端口為18089
@SpringBootApplication
@EnableFeignClients
public class ConsulProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulProviderApplication.class, args);
}
// 引用Nacos同步過來的服務(wù)
@FeignClient(name = "nacos-provider-cloud")
public interface HelloService {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String hello();
}
}
驗證注冊
1.可以看到我們的服務(wù)已經(jīng)在Consul注冊成功了
2.在瀏覽器輸入: http://localhost:18089/hello 可以看到頁面返回Hello World from Consul!
通過Nacos注冊Spring Cloud服務(wù)
創(chuàng)建一個Controller服務(wù)
下面的Controller中, /hello是Nacos本身的restful服務(wù),/consul-hello 是引用的在Consul注冊的服務(wù)
@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類, 應(yīng)用端口為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.可以看到我們的服務(wù)已經(jīng)在Nacos注冊成功了
2.在瀏覽器輸入: http://localhost:18088/hello 可以看到頁面返回Hello World from Nacos!
添加同步任務(wù)
添加同步任務(wù)
1.打開Nacos-Sync 控制臺,添加同步任務(wù)容劳。
選擇 服務(wù)同步 -> 新增同步, 如圖
2.添加完成效果
打開Nacos 控制臺 查看同步結(jié)果
打開Nacos 控制臺: http://localhost:8848/nacos
選擇 服務(wù)管理-> 服務(wù)列表 ,如圖
打開瀏覽器: http://localhost:18088/consul-hello 如圖
打開Consul 控制臺 查看同步結(jié)果
打開Consul 控制臺: http://localhost:8900/ui/dc1/services
打開瀏覽器: http://localhost:18089/nacos-hello 如圖
總結(jié)
從上面的演示中,我們可以看到Nacos-Sync已經(jīng)可以支持Nacos和Consul的Spring Cloud應(yīng)用的雙向同步,可以很好的在Spring Cloud中支持Consul平滑遷移到Nacos應(yīng)用.
稍微美中不足的暫時還沒支持一鍵批量遷移,現(xiàn)在的服務(wù)同步,基本都需要建立一個服務(wù)維度的服務(wù),后面陸續(xù)也會支持,也歡迎社區(qū)的小伙伴一起參與共建。
尼采:那些殺不死你的闸度,終將使你變得更強大!