Consul 提供了高可用的kv存儲,集羣架構,這點和etcd zookeeper相似。 另外也提供了自動服務發現註冊的套件,而且可否對服務進行健康檢查。 結合consul-template能夠實現服務提供方信息更新(好比增長了API服務器)時,自動生成配置文件給服務使用方自動更新配置。java
從圖中可看到的是Consul支持跨數據中心,在每一個數據中心有client和server。通常server是3-5個,少了會影響可靠性,多了會影響速度。client則沒有數量的限制。node
集羣經過goosip協議管理全部node成員和廣播集羣消息,client須要配置文件就能發現急羣衆全部的server,節點故障檢測被分不到整個集羣,不須要server的參與。全部server經過Raft協議進行選主(leader), leader負責處理全部的查詢和事務。服務器
server還負責與其餘數據中心交互來處理跨數據中心的請求,當server收到這種請求它會將請求轉發到相應的數據中心活本地的leader。架構
client和server本質都是consul的agent,只是角色不一樣(在啓動時指定參數便可)。以前咱們產線環境並無徹底按照官方架構圖(即client-server模式)進行部署,而是採用了所有server的模式,以下圖:負載均衡
這種架構下帶來的問題有兩個:post
ConsulClient client = new ConsulClient("負載均衡地址");
client.agentServiceDeregister("當前服務在註冊中心的Id");
複製代碼
因爲負載均衡,註銷時定位到的集羣節點多是server2,這樣就會致使服務的註銷失敗。解決的辦法是遍歷集羣中的全部節點(members)進行註銷,具體可參考:使用Consul時,服務沒法正常註銷spa
目前consul的總體架構升級爲client-server模式,服務註冊時再也不向consul-server集羣進行註冊,而是向服務所在機器的consul-client進行註冊,有consul-client將註冊信息同步到consul-server集羣中,架構以下:code
回顧以上兩個問題:cdn
注意:consul-client掛了,服務的註冊信息不會轉移到另一個consul-client中。因此要求服務自己處於不一樣的機器上來保證高可用。server
ConsulClient client = new ConsulClient("local-consul-client-ip");
client.agentServiceDeregister("當前服務在註冊中心的Id");
複製代碼