平滑從Consul遷移到 Nacos,再也不用擔心特朗普發(fā)瘋了...

作者 l 張龍
來源 l Hollis(ID:hollischuang)

image

近日火欧,國外的商業(yè)軟件公司HashiCorp在官網(wǎng)宣布:不允許中國境內(nèi)使用妇斤、部署和安裝該企業(yè)旗下的【企業(yè)版】產(chǎn)品和軟件。
image

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 的注冊和消費沮峡。

image

方案二(Nacos-Sync同步方案)

Nacos-Sync是一個跨注冊中心服務(wù)同步組件,支持Zookeeper/Eureka/Consul/Nacos等注冊中心間服務(wù)同步和遷移亿柑。

下圖展示通過Nacos Sync 完成 Consul 到 Nacos 服務(wù)遷移的過程邢疙。只需配置服務(wù)同步任務(wù),過度期間服務(wù)雙向同步,新版本升級連到Nacos即可疟游。

image

方案選型

雙注冊方案相對更穩(wěn)定呼畸,但是需要多次升級發(fā)布才能過度完成。相比之下Nacos-Sync侵入性更低颁虐,一次性遷移過度蛮原,也是我們推薦的一個方案。

Demo演示

下面我們通過一個簡單的 Demo 介紹一下怎么用 Nacos-Sync 完成 Consul 到 Nacos 服務(wù)遷移另绩。

環(huán)境準備

本例子包含 Spring-Cloud 將服務(wù)分別注冊到Consul儒陨、Nacos 兩個注冊中心互相同步演示

  1. Spring-Cloud 注冊到 Consul 的服務(wù) 同步到 Nacos

  2. 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.選擇 集群配置->新增集群

image

添加Nacos集群

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

image

添加完成效果

image

代碼演示

創(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注冊成功了

image

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注冊成功了

image

2.在瀏覽器輸入: http://localhost:18088/hello 可以看到頁面返回Hello World from Nacos!

添加同步任務(wù)

添加同步任務(wù)

1.打開Nacos-Sync 控制臺,添加同步任務(wù)容劳。
選擇 服務(wù)同步 -> 新增同步, 如圖

image
image

2.添加完成效果

image
打開Nacos 控制臺 查看同步結(jié)果

打開Nacos 控制臺: http://localhost:8848/nacos

選擇 服務(wù)管理-> 服務(wù)列表 ,如圖

image

打開瀏覽器: http://localhost:18088/consul-hello 如圖

image

打開Consul 控制臺 查看同步結(jié)果

打開Consul 控制臺: http://localhost:8900/ui/dc1/services

image

打開瀏覽器: http://localhost:18089/nacos-hello 如圖

image

總結(jié)

從上面的演示中,我們可以看到Nacos-Sync已經(jīng)可以支持Nacos和Consul的Spring Cloud應(yīng)用的雙向同步,可以很好的在Spring Cloud中支持Consul平滑遷移到Nacos應(yīng)用.

稍微美中不足的暫時還沒支持一鍵批量遷移,現(xiàn)在的服務(wù)同步,基本都需要建立一個服務(wù)維度的服務(wù),后面陸續(xù)也會支持,也歡迎社區(qū)的小伙伴一起參與共建。

尼采:那些殺不死你的闸度,終將使你變得更強大!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竭贩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子莺禁,更是在濱河造成了極大的恐慌留量,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哟冬,死亡現(xiàn)場離奇詭異楼熄,居然都是意外死亡,警方通過查閱死者的電腦和手機浩峡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門可岂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翰灾,你說我怎么就攤上這事缕粹。” “怎么了纸淮?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵平斩,是天一觀的道長。 經(jīng)常有香客問我咽块,道長绘面,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮飒货,結(jié)果婚禮上魄衅,老公的妹妹穿的比我還像新娘。我一直安慰自己塘辅,他們只是感情好晃虫,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扣墩,像睡著了一般哲银。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呻惕,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天荆责,我揣著相機與錄音,去河邊找鬼亚脆。 笑死做院,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的濒持。 我是一名探鬼主播键耕,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柑营!你這毒婦竟也來了屈雄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤官套,失蹤者是張志新(化名)和其女友劉穎酒奶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奶赔,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡惋嚎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纺阔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘸彤。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖笛钝,靈堂內(nèi)的尸體忽然破棺而出质况,到底是詐尸還是另有隱情,我是刑警寧澤玻靡,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布结榄,位于F島的核電站,受9級特大地震影響囤捻,放射性物質(zhì)發(fā)生泄漏臼朗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一进鸠、第九天 我趴在偏房一處隱蔽的房頂上張望撵溃。 院中可真熱鬧,春花似錦洪鸭、人聲如沸挡毅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪呈。三九已至段磨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耗绿,已是汗流浹背苹支。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留误阻,地道東北人债蜜。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像堕绩,于是被迫代替她去往敵國和親策幼。 傳聞我的和親對象是個殘疾皇子邑时,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355