服務消費者(Consumer)通過註冊中心訂閱服務提供者(Provider)的執行個體列表。當註冊中心進行變更或遇到突發情況, 或服務提供者與註冊中心間的連結因網路、CPU等其他因素髮生抖動時,可能會導致訂閱異常,從而使服務消費者擷取到空的服務提供者執行個體列表。您可以在Nacos用戶端或MSE Nacos服務端開啟推空保護功能,以提高整個系統的可用性。
前提條件
用戶端開啟推空保護
使用限制
Nacos Java Client 1.4.1及以上版本支援用戶端推空保護功能。
為避免使用有風險的版本,請參見版本推薦為用戶端、Spring Cloud和Dubbo選擇合適的版本。
操作步驟
若您使用的是Java版本的Nacos-Client。
引入
nacos-client依賴:<!-- ${nacos-client.version} 需為1.4.1及以上版本 --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>${nacos-client.version}</version> </dependency>在程式碼中按照下列方式配置:
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及以上,需要通過以下操作開啟推空保護。
登入MSE註冊配置中心管理主控台,並在頂部功能表列選擇地區。
在左側導覽列,選擇注册配置中心 > 实例列表。
在实例列表頁面,單擊目標執行個體名稱。
在左側導覽列,單擊参数设置。在参数设置頁面的实时生效参数地區,單擊forcePushEmptyProtectionForAllService右側操作列下方的编辑。
在参数编辑對話方塊,選中值右側的是,然後單擊确定。
說明為保證業務的最高可用性,建議所有情況下均開啟推空保護,即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配置 |
Spring Cloud初次開機NacosWatch功能且沒有其他執行個體副本的情境下,服務為空白。 | Spring Cloud Alibaba在新版本中新增功能NacosWatch,用於監聽自身服務狀態,該功能會在啟動應用時監聽自身服務。當該功能初次開機且沒有其他執行個體副本時,由於註冊中心沒有該服務,訂閱會觸發推空保護,應用啟動完成後恢複。 | 初次開機且無其他副本時忽略錯誤,或設定 |
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開關,即在所有情況下均進行推空保護。
相關文檔
通過MSE註冊配置中心提供的高可用能力,可以有效提升應用應對風險的能力。更多資訊,請參見MSE註冊配置中心高可用最佳實務。