全部產品
Search
文件中心

Microservices Engine:推空保護

更新時間:Dec 27, 2024

服務消費者(Consumer)通過註冊中心訂閱服務提供者(Provider)的執行個體列表。當註冊中心進行變更或遇到突發情況, 或服務提供者與註冊中心間的連結因網路、CPU等其他因素髮生抖動時,可能會導致訂閱異常,從而使服務消費者擷取到空的服務提供者執行個體列表。您可以在Nacos用戶端或MSE Nacos服務端開啟推空保護功能,以提高整個系統的可用性。

前提條件

用戶端開啟推空保護

使用限制

Nacos Java Client 1.4.1及以上版本支援用戶端推空保護功能。

說明

為避免使用有風險的版本,請參見版本推薦為用戶端、Spring Cloud和Dubbo選擇合適的版本。

操作步驟

  • 若您使用的是Java版本的Nacos-Client。

    1. 引入nacos-client依賴:

      <!-- ${nacos-client.version} 需為1.4.1及以上版本 -->
      <dependency>
          <groupId>com.alibaba.nacos</groupId>
          <artifactId>nacos-client</artifactId>
          <version>${nacos-client.version}</version>
      </dependency>
    2. 在程式碼中按照下列方式配置:

      Properties properties = new Properties();
      properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos執行個體網域名稱}");
      properties.put(PropertyKeyConst.NAMING_PUSH_EMPTY_PROTECTION, "true");
      NamingService naming = NamingFactory.createNamingService(properties);
  • 若您使用的是Spring Cloud Alibaba架構,請在應用設定檔添加下列配置。

    spring.cloud.nacos.discovery.namingPushEmptyProtection=true
  • 若您使用的是Dubbo架構,請在Dubbo設定檔的註冊中心連結URL中添加下列配置。

    dubbo.registry.address=nacos://${mseNacos執行個體網域名稱}:8848?namingPushEmptyProtection=true

服務端開啟推空保護

說明

由於目前仍有大量多語言的用戶端以及使用舊版本的Java用戶端,MSE在開源Nacos的基礎上增強了服務端能力,為您提供服務端開啟推空保護的能力。

使用限制

Nacos引擎版本需升級至2.1.0.0及以上。具體操作,請參見升級引擎版本

操作步驟

Nacos引擎的版本不同,開啟推空保護的方式也有所不同。

  • 若您的MSE Nacos引擎版本為2.1.0.0或2.1.0.1,無需任何操作,對應版本會自動開啟推空保護。

  • 若您的MSE Nacos引擎版本為2.1.0.2及以上,需要通過以下操作開啟推空保護。

    1. 登入MSE註冊配置中心管理主控台,並在頂部功能表列選擇地區。

    2. 在左側導覽列,選擇注册配置中心 > 实例列表

    3. 实例列表頁面,單擊目標執行個體名稱。

    4. 在左側導覽列,單擊参数设置。在参数设置頁面的实时生效参数地區,單擊forcePushEmptyProtectionForAllService右側操作列下方的编辑

    5. 参数编辑對話方塊,選中右側的,然後單擊确定

      說明

      為保證業務的最高可用性,建議所有情況下均開啟推空保護,即forcePushEmptyProtectionForAllService均選擇

結果驗證

當有服務觸發推空保護時,您可以在服務消費者(Consumer)所處節點上的${user.home}/logs/nacos/naming.log日誌中看到Trigger push empty protection for Service字樣。

正常情況下,該資訊不會頻繁出現,如果頻繁出現,可根據以下情況進行排查和治理。

  • 訂閱不存在的服務。

    如果應用訂閱不存在的服務,需要排查該應用是否仍需要該依賴關係。如不需要,刪除該無效依賴;如仍然需要,需重新發布上線該服務的提供者。

  • 應用訂閱的服務提供者為空白。

    • 查看該服務的提供者是否頻繁掉線。

    • 查看該服務的提供者是否與MSE Nacos叢集的網路連接不健康,導致Nacos認為此服務的提供者已經下線。

定位觸發推空保護的服務

錯誤資訊中包含觸發推空保護的服務。您可以通過Service{namespace='XXX'、group='xx'、name='xxxxxxx'、ephemeral=true、revision=0}得知服務消費者已訂閱哪個空服務。

已知容易觸發推空保護的主要情境

情境

觸發原因

解決方式

Dubbo 2的相容多訂閱情境下,舊格式服務名為空白。

Dubbo 2.7舊版本(2.7.6之前的版本)所註冊的服務名格式與Dubbo 2.7新版本的服務名格式不同。Dubbo 2.7新版本適用多訂閱的情境,即同時訂閱舊格式和新格式的服務名。當所有提供者均為新版本時,舊格式的服務在Nacos中必定不存在,導致訂閱舊格式時觸發推空保護。

升級引擎至2.1.0.1以上版本,或升級Dubbo至2.7.17以上。具體操作,請參見升級引擎版本

Dubbo 3的相容多訂閱情境下,介面級服務為空白。

Dubbo 3支援應用級服務發現,所註冊的服務名不再是介面名而是應用程式名稱。為了支援舊版本平滑升級,同時訂閱應用級和介面級的服務名。當所有提供者均為Dubbo 3版本時,介面級服務必定不存在,因此訂閱介面級服務時會觸發推空保護。

設定Dubbo配置dubbo.application.service-discovery.migration=FORCE_APPLICATION。具體操作,請參見Dubbo官網

Spring Cloud初次開機NacosWatch功能且沒有其他執行個體副本的情境下,服務為空白。

Spring Cloud Alibaba在新版本中新增功能NacosWatch,用於監聽自身服務狀態,該功能會在啟動應用時監聽自身服務。當該功能初次開機且沒有其他執行個體副本時,由於註冊中心沒有該服務,訂閱會觸發推空保護,應用啟動完成後恢複。

初次開機且無其他副本時忽略錯誤,或設定spring.cloud.nacos.discovery.watch.enabled=false關閉Watch功能。具體操作,請參見Spring Cloud Alibaba

Spring Cloud Gateway完全下線某服務情境下,服務狀態未同步。

Spring Cloud Gateway會在啟動時查詢註冊中心中目前所有的服務列表,並訂閱所有服務。例如,某個服務在Gateway啟動後徹底下線(全部執行個體移除),是因為註冊中心自動摘除了下線服務,但Spring Cloud Gateway不感知,仍然繼續訂閱,導致觸發推空保護。

目前Spring Cloud Gateway不支援動態感知某個服務完全移除後取消訂閱,建議您重啟Spring Cloud Gateway。

強制進行推空保護的情境

MSE Nacos 2.1.0.2及以上版本,引擎對推空保護的邏輯進行了最佳化,僅在開啟forcePushEmptyProtectionForAllService時保護所有空服務列表。但若在以下情境,即使forcePushEmptyProtectionForAllService開關為關閉狀態,為保證可用性和穩定性,系統仍然會自動啟動推空保護能力。

  • 引擎節點在進行升級、重啟或故障自愈時,節點將所有服務自動開啟2分鐘的推空保護,以保證此期間使用者業務可用性。

  • 當服務下所有執行個體全部移除時,叢集將針對該服務自動開啟1分鐘的推空保護,防止因網路抖動、服務提供者短時間內發生故障等問題導致的異常推空,以保證此情境下使用者業務可用性。

說明

為保證業務的最高可用性,建議開啟forcePushEmptyProtectionForAllService開關,即在所有情況下均進行推空保護。