Dubbo高可用
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高可用