1. 程式人生 > >Dubbo高可用

Dubbo高可用

自動 中心 face docs 數據庫 failover eth 繞過 100%

0. 什麽是高可用

高可用HA(High Availability)是分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供服務的時間。

假設系統一直能夠提供服務,我們說系統的可用性是100%;如果系統每運行100個時間單位,會有1個時間單位無法提供服務,我們說系統的可用性是99%;很多公司的高可用目標是4個9,也就是99.99%,這就意味著,系統的年停機時間為8.76個小時。

下面介紹配置dubbo的高可用的一些實踐方法。

1. zookeeper宕機與dubbo直連

在實際生產中,假如zookeeper註冊中心宕掉,一段時間內服務消費方還是能夠調用提供方的服務的,實際上它使用的本地緩存進行通訊,這只是dubbo健壯性的一種。

dubbo的健壯性表現:

  • 監控中心宕掉不影響使用,只是丟失部分采樣數據
  • 數據庫宕掉後,註冊中心仍能通過緩存提供服務列表查詢,但不能註冊新服務
  • 註冊中心對等集群,任意一臺宕掉後,將自動切換到另一臺
  • 註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊
  • 服務提供者無狀態,任意一臺宕掉後,不影響使用
  • 服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復

註冊中心的作用在於保存服務提供者的位置信息,我們可以完全可以繞過註冊中心——采用dubbo直連,即在服務消費方配置服務提供方的位置信息。

點對點直連方式,將以服務接口為單位,忽略註冊中心的提供者列表,A 接口配置點對點,不影響 B 接口從註冊中心獲取列表。

xml配置方式

<dubbo:reference id="userService" interface="com.zang.gmall.service.UserService" url="dubbo://localhost:20880" />

註解上直接添加

 @Reference(url = "127.0.0.1:20880")   
 UserService userService;

2. 集群下dubbo負載均衡配置

在集群負載均衡時,Dubbo提供了4種均衡策略,如:Random LoadBalance(隨機均衡算法)、;RoundRobin LoadBalance(權重輪循均衡算法)、LeastAction LoadBalance(最少活躍調用數均衡算法)、ConsistentHash LoadBalance(一致性Hash均衡算法)。缺省時為Random隨機調用。

技術分享圖片

幾種負載均衡策略的解釋(截取自官方文檔)

技術分享圖片

配置方法很簡單,服務端和客戶端都可以配置服務級別或者方法級別的策略。

消費方服務級別配置(基於註解的權重輪詢均衡算法)

 @Reference(loadbalance = "roundrobin")
 UserService userService;

服務方方法級別配置(基於xml配置的權重輪詢均衡算法)

<dubbo:service interface="com.zang.gmall.service.UserService" 
<dubbo:method name="getUserAddressList" loadbalance="roundrobin"></dubbo:method>
</dubbo:service>

3. 權重設置

當不設置負載均衡策略,即采用默認的Random LoadBalance(隨機均衡算法)時,默認每個服務的權重相同,我們可以通過設置權重來分配訪問的隨機性。

權重默認為100,可以在暴露服務的同時設置

技術分享圖片

更便捷的方法是通過管理控制臺來直接設置服務提供者

技術分享圖片

4. 服務降級

當服務器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務器資源以保證核心交易正常運作或高效運作。

可以通過服務降級功能臨時屏蔽某個出錯的非關鍵服務,並定義降級後的返回策略(不調用服務即返回為空 or 調用失敗返回為空

向註冊中心寫入動態配置覆蓋規則:

RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));

其中:

  • mock=force:return+null 表示消費方對該服務的方法調用都直接返回 null 值,不發起遠程調用。用來屏蔽不重要服務不可用時對調用方的影響。
  • 還可以改為 mock=fail:return+null 表示消費方對該服務的方法調用在失敗後,再返回 null 值,不拋異常。用來容忍不重要服務不穩定時對調用方的影響。

通過操作管理控制臺也可以方便的進行服務降級:

技術分享圖片

5. 集群容錯

在集群調用失敗時,Dubbo 提供了多種容錯方案,缺省為 failover 重試。

技術分享圖片

集群容錯模式:

Dubbo高可用