consul服務註冊與服務發現的巨坑

2021-09-02 14:58:53 字數 3169 閱讀 4367

**:

最近使用consul作為專案的服務註冊與服務發現的基礎功能。在塔建集群使用中遇到一些坑,下面乙個個的記錄下來。

consul集群的node也就是我們所說的consul例項。集群由多個node組成,為了集群的可用性,需要超過半數的node啟用server。如5個node中建議3個啟用server模式,3個node組成的集群就2個node啟用server模式。

看到這裡的時候你一定覺得沒有什麼問題呀,但是consul坑就是多。加入你的集群組成如下:

node          address              status  type    build  protocol  dc                    segment

bj-mqtest-01 10.163.145.117:8301 alive server 1.0.6 2 iget-topology-aliyun bj-mqtest-02 10.163.147.47:8301 alive server 1.0.6 2 iget-topology-aliyun bj-tgo-01 10.163.145.110:8301 alive client 1.0.6 2 iget-topology-aliyun

那麼client可以使用上述的3個ip連線到consul集群,假設client a使用使用10.163.145.117註冊了service,重啟後使用位址10.163.145.110註冊之前的service資訊,此時你就會驚喜的發現,ui可以同時看到在同乙個servicename下存在兩個相同的serviceid。

這就是consul集群多node的坑,因為service底層雖然使用了kv儲存,但是service的key與serviceid無關,所以在集群中可以重複。

集群中只有乙個node使用server模式,其他的都是client模式。缺點很明顯,如果server的node掛了,那麼集群的可用性就沒有了。

相同的客戶端使用相同的node位址,這樣就可以確保同乙個servicename下不存在兩個相同的serviceid。缺點是如果客戶端繫結的node掛了,那麼client就使用。

**給出

}客戶端隨機使用集群中的任意乙個位址,但是註冊之前先判斷該servicename是否已經存在要註冊的serviceid了,如果存在就刪除重新註冊。缺點就是watch會有較多事件,可以公升級為如果存在並且是健康的就不允許重複註冊,我使用的就是該方案。

一開始很多人都會覺得服務出現問題了下架了掛了,那麼就會被移出了。但是在consul中刪除service沒有那麼簡單! 

請檢視官網文件: 

catalog文件

agent/service文件

看著似乎任選乙個就可以做到正確刪除service了!可以繼續說一聲,沒有那麼簡單,consul的坑就是多。

選擇了/agent/service/deregister/:service_id介面,會發現你無法刪除別的node的service。比如10.163.145.117中有個serviceid為agent_***x_v1,但是客戶端連線consul使用的ip為10.163.145.110,那麼就無法刪除掉agent_***x_v1

沒事不是還有乙個介面沒有使用嗎?再來看看/catalog/deregister,執行完成後看了ui,嗯嗯的確是刪除了agent_***x_v1。等等。。。 。。。 30s後發現agent_***x_v1又出現了,這是怎麼回事????

請檢視consul的bugunable to deregister a service #1188。

if len(c.options.addrs) > 0 

addrmap[addr] = host

}rsp, _, _ := c.client.health().service(s.name, "", false, nil)

for _, srsp := range rsp

err = client.agent().servicederegister(serviceid)

log.infof("servicederegister host=%v , serviceid=%v", host, serviceid)}}

}} else

可以肯定的是consul還有其他的坑的,但是這兩個坑讓我記憶深刻,記錄下來給準備使用consul或者已經遇到這些坑的同學乙個提醒。

consul服務註冊與發現

是一套開源的分布式服務發現與配置管理系統,有hashicorp公司用go語言開發,提供了微服務系統中的服務治理,配置中心,控制匯流排等功能。這些功能中的每乙個都可以根據需要單獨使用,也可以一起使用,以構建全方位的服務網路,總之consul提供了一整套服務網路解決方案 org.springframew...

四 服務註冊與發現Consul

三 註冊中心的對比 consul是一套開源的分布式服務發現和配置管理系統,由hashicorp公司用go語言開發。consul提供了微服務系統中的服務治理 配置中心控制匯流排等功能。這些功能中的每乙個都可以根據需要單獨使用,也可以一 起使用以構建全方位的服務網格,總之consul提供了一種完整的服務...

微服務 Consul(服務註冊發現)

類似dns伺服器會根據我們的網域名稱解析出乙個ip位址,然後去請求這個ip來獲取我們想要的資料,它可以讓我們只需說我想要什麼服務即可,而不必去關心服務提供者的具體網路位置 ip 位址 埠等 目前,服務發現主要分為兩種模式,客戶端模式與服務端模式 在客戶端模式下,首先要到服務註冊中心獲取服務列表,然後...