1. 程式人生 > >10. 微服務理論與實踐-服務註冊與發現

10. 微服務理論與實踐-服務註冊與發現

微服務理論與實踐-服務註冊與發現

這裡寫圖片描述

1 背景

  • 服務的客戶端(包括API閘道器或者其他服務)如何獲取服務端例項的位置
  • 每個服務端例項都會在特定的位置(主機及埠)通過HTTP/REST或者Thrift等方式釋出一個遠端API
  • 服務端例項的具體數量和位置會發生動態變化
  • 虛擬機器與容器通常會被分配動態IP地址

2 方案

2.1 客戶端服務發現

這裡寫圖片描述

向某一服務傳送請求時,客戶端會通過查詢Servcie Registry,即服務登錄檔來回去該服務的具體位置/該登錄檔包含全部服務的位置。

2.2 客戶端服務發現的優缺點

  1. 優點

    • 相比服務端發現,客戶端服務發現的活動部件與網路中轉數量更少。
  2. 缺點

    • 需要為應用程式中使用的每種語言建立客戶端發現邏輯

2.3 服務端服務發現

這裡寫圖片描述

向某一服務傳送請求時,客戶端會通知在已知位置的路由器(或者負載均衡器)傳送請求。路由器會訪問服務登錄檔,並向可用的服務例項轉發該請求。服務登錄檔也可能被內建於路由器之中。

這裡寫圖片描述

2.4 服務端發現的優缺點

  1. 優點

    • 相較客戶端發現,其客戶端程式碼無需實現服務發現功能,只需要向路由機制傳送請求即可。
  2. 缺點

    • 除非成為雲環境的一部分,否則該路由機制必須作為另一個系統元件進行安裝與配置。為實現可用性和一定的接入能力,還需要為其配置一定數量的副本。

    • 相較於客戶端發現,服務端發現需要更多的網路跳轉

3 服務登錄檔

3.1 背景

  • 服務的客戶端需要使用客戶端發現機制或者服務端發現機制,獲取需要傳送請求的服務例項的位置

  • 每個服務例項都會在特定位置(主機與埠)通過HTTP/REST或者Thrift等方式釋出一個遠端API。

  • 服務實力的數量和位置會動態的發生變化。虛擬機器與容器通常會被分配一個動態的IP地址。

3.2 方案

建立一套服務登錄檔。即一個包括服務、服務的例項和起位置的資料庫。各服務示例需要在啟動時註冊至服務登錄檔,並在關閉的時候進行登出。該服務的客戶端或者路由器通過查詢此服務登錄檔獲取可用的服務例項

3.3 服務登錄檔模式的優缺點

  1. 優點

    • 服務的客戶端及路由器可以獲取可用的服務例項的位置
  2. 缺點

    • 除非服務登錄檔被內置於基礎設施,否則其必須做為另外的基礎設施元件進行安裝,配置及管理。

    • 需要解決各服務示例如何註冊至登錄檔,如何從登錄檔中登出

3.4 服務登錄檔的註冊方式

3.4.1 需求

  • 各服務例項必須在啟動時註冊到服務登錄檔,並在關閉時從服務登錄檔中登出

  • 崩潰的服務例項必須從服務登錄檔中登出

  • 在執行但無力處理請求的服務例項必須從服務登錄檔中登出

3.4.2 方案

3.4.2.1 自注冊

一項服務例項必須可以自動註冊到服務登錄檔中。在啟動時,該服務例項將自身(主機與IP地址)註冊至服務登錄檔,使自身可被發現。客戶端必須定期更新其註冊資訊,確保登錄檔獲悉其仍處於執行狀態。在關閉時,服務例項從服務登錄檔中自動登出。這一流程通常由微服務底盤框架實現。

3.4.2.2 自注冊的優缺點

  1. 優點

    • 服務例項瞭解自身的狀態,因而能夠實現比啟動/停止更為負責的狀態模型。
  2. 缺點

    • 將服務與登錄檔耦合起來
    • 需要為編寫服務時使用的每種語言分別實現服務註冊邏輯。
    • 正在執行但無法處理請求的服務示例往往無法自動在服務登錄檔中進行自我登出

3.4.2.3 第三方註冊

由第三方負責將服務和服務例項在服務登錄檔中的註冊,並在服務啟動的時候將服務例項註冊到服務登錄檔。而在服務例項關閉的時候在服務登錄檔中登出

3.4.2.4 第三方註冊的優缺點

  1. 優點

    • 與自注冊相比,服務端無需實現自動註冊邏輯,複雜度較低
    • 註冊工具可以對服務進行健康檢查,並根據健康檢查註冊或者登出該例項
  2. 缺點

    • 第三方註冊只能瞭解服務例項的一些表層狀態,例如其是否正在執行,並不能判斷正在執行的服務是否能夠處理請求
    • 除非該註冊工具屬於基礎設施的一部分,否則我們需要對其進行安裝、配置及維護。由於其屬於關鍵部件,需要保證其高可用。