最近參加了幾場 Java 面試,發現大多數的微服務實踐仍是 Eureka 偏多,鑑於筆者的單位選型 Consul,這裏對 Consul 作簡單總結。html
該篇是 Docker 實戰系列的第三篇。傳送門:node
首先 Consul 有如下幾個關鍵特性:程序員
做爲高頻的提問方式,面試官永遠從十萬個爲何開始。可是最爲程序員,仍是須要知其然,知其因此然
。如下是幾個經常使用的服務發現組件的對比。web
服務發現組件的選型主要從如下幾個方面進行。CAP 理論、一致性算法、多數據中心、健康檢查、是否支持 k8s 等。面試
1. CAP算法
一致性的強制數據統一要求,必然會致使在更新數據時部分節點處於被鎖定狀態,此時不可對外提供服務,影響了服務的可用性。docker
2. 一致性算法bootstrap
Raft
算法將 Server 分爲三種類型:Leader、Follower 和 Candidate。Leader 處理全部的查詢和事務,並向 Follower 同步事務。Follower 會將全部的 RPC 查詢和事務轉發給 Leader 處理,它僅從 Leader 接受事務的同步。數據的一致性以 Leader 中的數據爲準實現。服務器
如下是幾種常見的一致性算法網絡
3. 多數據中心
Consul 經過 WAN 的 Gossip 協議,完成跨數據中心的同步;而其餘的產品則須要額外的開發工做來實現;
注意多數據中心和多節點是 2 個概念
Gossip 協議是 P2P 網絡中比較成熟的協議。Gossip 協議的最大的好處是,即便集羣節點的數量增長,每一個節點的負載也不會增長不少,幾乎是恆定的。這就容許 Consul 管理的集羣規模能橫向擴展到數千個節點。
Consul 的每一個 Agent 會利用 Gossip 協議互相檢查在線狀態,本質上是節點之間互 Ping,分擔了服務器節點的心跳壓力。若是有節點掉線,不用服務器節點檢查,其餘普通節點會發現,而後用 Gossip 廣播給整個集羣。
consul 的架構是什麼,官方給出了一個很直觀的圖片
單獨看數據中心 1,能夠看出 consul 的集羣是由 N 個 SERVER,加上 M 個 CLIENT 組成的。而不論是 SERVER 仍是 CLIENT,都是 consul 的一個節點,全部的服務均可以註冊到這些節點上,正是經過這些節點實現服務註冊信息的共享。除了這兩個,還有一些小細節,一一簡單介紹。
CLIENT
CLIENT 表示 consul 的 client 模式,就是客戶端模式。是 consul 節點的一種模式,這種模式下,全部註冊到當前節點的服務會被轉發到 SERVER,自己是不持久化這些信息。
SERVER
SERVER 表示 consul 的 server 模式,代表這個 consul 是個 server,這種模式下,功能和 CLIENT 都同樣,惟一不一樣的是,它會把全部的信息持久化的本地,這樣遇到故障,信息是能夠被保留的。
SERVER-LEADER
中間那個 SERVER 下面有 LEADER 的字眼,代表這個 SERVER 是它們的老大,它和其它 SERVER 不同的一點是,它須要負責同步註冊的信息給其它的 SERVER,同時也要負責各個節點的健康監測。
docker-compose-consul-cluster.yml
version: '3' services: consul-server1: image: consul:latest hostname: "consul-server1" ports: - "8500:8500" - "53" volumes: - ./consul/data1:/consul/data command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0" consul-server2: image: consul:latest hostname: "consul-server2" ports: - "8501:8500" - "53" volumes: - ./consul/data2:/consul/data command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0" depends_on: - consul-server1 consul-server3: image: consul:latest hostname: "consul-server3" ports: - "8502:8500" - "53" volumes: - ./consul/data3:/consul/data command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0" depends_on: - consul-server1 consul-node1: image: consul:latest hostname: "consul-node1" command: "agent -join consul-server1 -disable-host-node-id" depends_on: - consul-server1 consul-node2: image: consul:latest hostname: "consul-node2" command: "agent -join consul-server1 -disable-host-node-id" depends_on: - consul-server1
執行 docker-compose -f docker-compose-consul-cluster.yml up -d
啓動,而後訪問 http://localhost:8500
看到下圖即啓動成功
Docker 實戰系列皆以快速搭建學習環境爲主,Consul 的特性學習及生產環境配置還任重道遠。閱讀過程當中若有疑問或錯誤,還望多多指正。
公衆號 【當我趕上你】
原文出處:https://www.cnblogs.com/idea360/p/12398934.html