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

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

image

近日,國外的商業軟件公司HashiCorp在官網宣布:不允許中國境內使用、部署和安裝該企業旗下的【企業版】產品和軟件。
image

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

image

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

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

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

image

方案選型

雙注冊方案相對更穩定,但是需要多次升級發布才能過度完成。相比之下Nacos-Sync侵入性更低,一次性遷移過度,也是我們推薦的一個方案。

Demo演示

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

環境準備

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

  1. Spring-Cloud 注冊到 Consul 的服務 同步到 Nacos

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

image

添加Nacos集群

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

image

添加完成效果

image

代碼演示

創建兩個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注冊成功了

image

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

image

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

添加同步任務

添加同步任務

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

image
image

2.添加完成效果

image
打開Nacos 控制臺 查看同步結果

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

選擇 服務管理-> 服務列表 ,如圖

image

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

image

打開Consul 控制臺 查看同步結果

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

image

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

image

總結

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

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375