天天看點

淺析微服務注冊中心的注冊與發現淺析微服務注冊中心的注冊與發現

淺析微服務注冊中心的注冊與發現

注冊中心是用來集中管理微服務,實作服務的注冊,發現,檢查等功能,目前比較成熟的注冊中心元件有很多,如Consul,eureka,zookeeper,etcd,nacos,不同元件之間性能,并發,高可用都會有差距。但對于使用者來說基本的功能實作都是透明的。其實如果我們自己開發一套注冊中心也可以,能夠滿足基本的功能即可。

  1. 支援IP端口的注冊:注冊中心提供接口将服務釋出者的資訊添加進去。

  2. 提供一些其他資訊,如服務名稱,隻注冊IP僅能實作基本功能,如果需要加密或者負載均衡時,如對相同服務下不同節點設定不同權重進行流量配置設定,都需要更加詳細的規則參數來實作。

  3. 優雅關閉,服務下線功能是必須的,既然注冊了必須在節點失效的時候及時剔除掉,如果沒有及時下線,會造成大量請求依舊錯誤的通路。注冊中心可以提供關閉接口,而應用程式裡也應在shutdown的時候調用接口來合理進行下線操作。

  4. 健康檢查功能,上面的優雅關閉隻是正常情況,當使用者采用kill -9這種粗暴的停止方式,或者網絡不通等異常情況發生,注冊中心需要及時檢查到異常情況的發生。健康檢查也分為很多種。

    1. 用戶端心跳連接配接:用戶端每隔一定時間主動發送“心跳”的方式來向服務端表明自己的服務狀态正常,心跳可以是 TCP 的形式,也可以是 HTTP 的形式。
    2. 保持長連接配接:可以通過維持用戶端和服務端的一個 socket 長連接配接自己實作一個用戶端心跳的方式。
    3. 建立會話:ZooKeeper 并沒有主動的發送心跳,而是依賴了元件本身提供的臨時節點的特性,通過 ZooKeeper 連接配接的 session 來維持臨時節點。
    4. 注冊中心主動探測:調用服務釋出者某個 HTTP 接口來完成健康檢查,例如consul就有這樣的探測機制。
  5. 連接配接注冊中心:簡單的方法就是在配置檔案中固定注冊中心IP位址,然而這樣的擴充性會很差,無法支援水準擴容的多機部署,或者寫多台伺服器的位址,類似Kafka從中擷取中繼資料資訊,然後再進行二次連接配接。

  6. 服務發現:如果檢視本機釋出和訂閱的服務,注冊中心需要提供了豐富的接口,支援根據應用名、IP、訂閱服務名、釋出服務名,來進行多層次的組合查詢。

  7. 服務訂閱(非必需):服務有節點退出或新的節點加入時,訂閱者如何及時收到通知,這裡便是pull和push的問題,push典型的,例如zookeeper基于socket長連接配接實作notify,還有一種長輪詢的實作,這兩種都有一定的技術難度,通過pull的方式定時輪詢會簡單一些,但需要調整合适的請求時間間隔,頻率越高注冊中心所承受的壓力也越大。

當服務節點數越來越多時,注冊中心的性能會成為瓶頸,這時候就需要通過水準擴容來提升服務注冊中心叢集的性能,對于采用了類 Paxos 協定的強一緻性的元件,由于每次寫操作需要過半的節點确認,水準擴容隻能提升叢集的讀性能,而不能提升叢集的寫性能,因為所有的寫操作都需要leader節點來完成,對于采用最終一緻性的元件來說,水準擴容可以同時提升叢集的寫性能和讀性能,但對實時資料的一緻性不能提供保證。在安全方面,必須在每一次的注冊、釋出、心跳,都帶上鑒權的資訊,防止惡意注冊導緻的資訊洩漏和服務攻擊。

最後,基于以上這些可以實作一個注冊中心的大緻輪廓,而更加進階的功能,如服務高可用和容災,安全問題還需要進一步完善。