淺析微服務注冊中心的注冊與發現
注冊中心是用來集中管理微服務,實作服務的注冊,發現,檢查等功能,目前比較成熟的注冊中心元件有很多,如Consul,eureka,zookeeper,etcd,nacos,不同元件之間性能,并發,高可用都會有差距。但對于使用者來說基本的功能實作都是透明的。其實如果我們自己開發一套注冊中心也可以,能夠滿足基本的功能即可。
-
支援IP端口的注冊:注冊中心提供接口将服務釋出者的資訊添加進去。
-
提供一些其他資訊,如服務名稱,隻注冊IP僅能實作基本功能,如果需要加密或者負載均衡時,如對相同服務下不同節點設定不同權重進行流量配置設定,都需要更加詳細的規則參數來實作。
-
優雅關閉,服務下線功能是必須的,既然注冊了必須在節點失效的時候及時剔除掉,如果沒有及時下線,會造成大量請求依舊錯誤的通路。注冊中心可以提供關閉接口,而應用程式裡也應在shutdown的時候調用接口來合理進行下線操作。
-
健康檢查功能,上面的優雅關閉隻是正常情況,當使用者采用kill -9這種粗暴的停止方式,或者網絡不通等異常情況發生,注冊中心需要及時檢查到異常情況的發生。健康檢查也分為很多種。
-
用戶端心跳連接配接:用戶端每隔一定時間主動發送“心跳”的方式來向服務端表明自己的服務狀态正常,心跳可以是 TCP 的形式,也可以是 HTTP 的形式。
-
保持長連接配接:可以通過維持用戶端和服務端的一個 socket 長連接配接自己實作一個用戶端心跳的方式。
-
建立會話:ZooKeeper 并沒有主動的發送心跳,而是依賴了元件本身提供的臨時節點的特性,通過 ZooKeeper 連接配接的 session 來維持臨時節點。
-
注冊中心主動探測:調用服務釋出者某個 HTTP 接口來完成健康檢查,例如consul就有這樣的探測機制。
-
-
連接配接注冊中心:簡單的方法就是在配置檔案中固定注冊中心IP位址,然而這樣的擴充性會很差,無法支援水準擴容的多機部署,或者寫多台伺服器的位址,類似Kafka從中擷取中繼資料資訊,然後再進行二次連接配接。
-
服務發現:如果檢視本機釋出和訂閱的服務,注冊中心需要提供了豐富的接口,支援根據應用名、IP、訂閱服務名、釋出服務名,來進行多層次的組合查詢。
-
服務訂閱(非必需):服務有節點退出或新的節點加入時,訂閱者如何及時收到通知,這裡便是pull和push的問題,push典型的,例如zookeeper基于socket長連接配接實作notify,還有一種長輪詢的實作,這兩種都有一定的技術難度,通過pull的方式定時輪詢會簡單一些,但需要調整合适的請求時間間隔,頻率越高注冊中心所承受的壓力也越大。