?https://zhuanlan.zhihu.com/p/32027014
明明白白的聊一下什么是服務發現-CSDN博客
一、服務發現 是什么
????????在傳統的系統部署中,服務運行在一個固定的已知的 IP 和端口上,如果一個服務需要調用另外一個服務,可以通過地址直接調用。
? ? ? ? 但是,服務實例的啟動和銷毀是很頻繁的,地址在動態變化,無法將請求固定發送到某個IP上。所以就 有需要將請求發送到 地址動態變化 的服務實例上。
? ? ? ? 這需要兩個步驟:
? ? ? ? 1. 服務注冊 — 存儲服務的主機和端口信息,以及對應的服務名字。
? ? ? ? 2. 服務發現 — 允許其他用戶發現服務注冊階段存儲的信息。
? ? ? ? 所以,服務發現 就是只通過服務的名字就能夠使用服務,并且支持服務所在地址是動態變化的。
二、服務發現 提供了什么功能
1.?健康檢查
????????作為一個服務發現服務,不僅要保存服務的訪問方式(ip+port),還需要有服務監聽的功能,隔一段時間去監聽你的服務是否正常。即健康檢查。
2. 負載均衡
????????有多個節點提供一個服務,特別是高并發的時候,需要更多的節點。即負載均衡。
3. 全局分布
? ? ? ? 一個服務需要改動時,不應該讓其他服務做相應改動,服務的鍵值存儲 需要是全局性的。即服務注冊中心。
三、服務發現 的兩種發現方式
????????有兩種主要的服務發現方式:客戶端發現 和 服務端發現
1.?客戶端服務發現
(1) 解釋:
????????客戶端查詢服務注冊中心,獲取服務的實際網絡地址。
????????客戶端通過負載均衡算法,選擇一個可用的服務實例。
????????客戶端將請求發送至該服務實例。
(2) 優點:架構簡單,客戶端可以自己選擇負載均衡策略。
? ? ? 缺點:客戶端需要自己實現負載均衡,自己訪問服務實例,有一定開發成本。
2. 服務端服務發現
(1)?解釋:
????????客戶端向 負載均衡器?發送業務請求。
????????負載均衡器 往服務注冊中心查詢可用的服務,然后轉發請求到該 服務實例上。
(2) 優點:服務的發現邏輯對客戶端是透明的。
? ? ? 缺點:需要額外部署和維護高可用的負載均衡器。
? ? ? ?
四、服務注冊中心
????????服務注冊中心 的位置 如上面 服務發現框架圖 所示。
????????服務注冊中心是服務發現的核心,保存了各個可用服務實例的網絡地址(IP和端口)。
????????服務注冊中心必須要有高可用性和實時更新功能。
????????實時更新功能,主要是服務的注冊和注銷。?有兩種實現方式:
1. 服務自己注冊
????????服務實例必須自己主動的到 服務注冊中心 進行注冊和注銷。
????????服務注冊中心 使用 心跳機制 來監控實例異常關閉 并注銷。
????????優點:框架簡單,不需要其它輔助組件。
????????缺點:各個服務實例 和 服務注冊中心 的耦合起來。
2.?第三方組件注冊
????????通過其他組件來實現,到 服務注冊中心 進行注冊和注銷。
? ? ? ? 組件需要監控實例的啟動和關閉。
????????組件可以通過如事件訂閱等方式來監控服務實例的狀態。
????????優點:使用輔助組件 來實現 服務注冊中新 和 服務實例解耦。
????????缺點:增加框架復雜度,添加了輔助組件。
五、常見服務發現框架對比
六、Consul 介紹
1. Consul相比Etcd更強大
????????如上圖所示,Consul相比Etcd更強大,支持 多數據中心、健康檢查、DNS協議。
????????consul通過 DNS或者HTTP接口 使服務注冊和服務發現變的更容易? ? ?
2.?Consul 框架圖
? ? ? ? 可見,使用的是 客戶端服務發現方式,客戶端直接訪問服務實例。
3.?采用 Raft 算法,用來保證服務的高可用。
? ? ? ? 目的是保證?系統中有一兩個服務器當機,也不會影響其處理過程。
七、思考服務發現應該怎么做
? ? ? ? 主要考慮兩個點:
1. 服務實例怎么注冊和注銷:建議 服務實例 自己主動到 服務注冊中心 去進行注冊和注銷,不要使用其他組件去監控服務實例,降低框架復雜度。
2. 客戶端怎么訪問服務:建議客戶端直接訪問 服務注冊中心 獲取服務地址,不要維護高可用的負載均衡中心,降低框架復雜度。
3. 總體:不是很龐大的生態,應該以降低框架服務度為主。