十、Dubbo——服務高可用、負載均衡、服務降級容錯以及整合hystrix

1 Dubbo 高可用

zookeeper宕機與dubbo直連
現象:zookeeper註冊中心宕機,還可以消費dubbo暴露的服務。
原因:dubbo服務的健壯性
(1)監控中心宕掉不影響使用,只是丟失部分採樣數據
(2)數據庫宕掉後,註冊中心仍能通過緩存提供服務列表查詢,但不能註冊新服務
(3)註冊中心對等集羣,任意一臺宕掉後,將自動切換到另一臺
(4) 註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊
(5)服務提供者無狀態,任意一臺宕掉後,不影響使用
(6)服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復
高可用:通過設計,減少系統不能提供服務的時間;

(1)zk註冊中心正常工作,訪問正常
在這裏插入圖片描述
(2)zk停止服務,服務無限嘗試連接註冊中心,但由於已經調用的接口有本地緩存,所以仍可以正常訪問

在這裏插入圖片描述
在這裏插入圖片描述

dubbo直連
在沒有註冊中心的情況下可以通過註解指定訪問的服務IP,直接調用
@Reference(url = “127.0.0.1:20881”)
在這裏插入圖片描述

2 集羣下dubbo負載均衡配置

在集羣負載均衡時,Dubbo 提供了多種均衡策略,缺省爲 random 隨機調用。

負載均衡策略
(1)Random LoadBalance隨機,按權重設置隨機概率。
在一個截面上碰撞的概率高,但調用量越大分佈越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。

(2)RoundRobin LoadBalance 輪循,按公約後的權重設置輪循比率。(有序的調用)
存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。

(3)LeastActive LoadBalance最少活躍調用數,相同活躍數的隨機,活躍數指調用前後計數差。
使慢的提供者收到更少請求,因爲越慢的提供者的調用前後計數差會越大。

(4)ConsistentHash LoadBalance一致性 Hash,相同參數的請求總是發到同一提供者。(根據請求參數分配調用,如id)
當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。算法參見:http://en.wikipedia.org/wiki/Consistent_hashing
缺省只對第一個參數 Hash,如果要修改,請配置 <dubbo:parameter key=“hash.arguments” value=“0,1” />
缺省用 160 份虛擬節點,如果要修改,請配置 <dubbo:parameter key=“hash.nodes” value=“320” />

3 降級處理
1)服務降級
==當服務器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務器資源以保證核心交易正常運作或高效運作。==可以通過服務降級功能臨時屏蔽某個出錯的非關鍵服務,並定義降級後的返回策略。

通過服務管理界面可以設置服務降級容錯
在這裏插入圖片描述

其中:
(1)mock=force:return+null 表示消費方對該服務的方法調用都直接返回 null 值,不發起遠程調用。用來屏蔽不重要服務不可用時對調用方的影響。
在這裏插入圖片描述
在這裏插入圖片描述
(2)還可以改爲 mock=fail:return+null 表示消費方對該服務的方法調用在失敗後,再返回 null 值,不拋異常。用來容忍不重要服務不穩定時對調用方的影響。
在這裏插入圖片描述

4 集羣容錯
在集羣調用失敗時,Dubbo 提供了多種容錯方案,缺省爲 failover 重試。
集羣容錯模式
(1)Failover Cluster 失敗自動切換,當出現失敗,重試其它服務器。
通常用於讀操作,但重試會帶來更長延遲。可通過 retries=“2” 來設置重試次數(不含第一次)。

重試次數配置如下:
<dubbo:service retries=“2” />

<dubbo:reference retries=“2” />

dubbo:reference
<dubbo:method name=“findFoo” retries=“2” />
</dubbo:reference>

(2)Failfast Cluster 快速失敗,只發起一次調用,失敗立即報錯。
通常用於非冪等性的寫操作,比如新增記錄。

(3)Failsafe Cluster 失敗安全,出現異常時,直接忽略。
通常用於寫入審計日誌等操作。

(4)Failback Cluster
失敗自動恢復,後臺記錄失敗請求,定時重發。通常用於消息通知操作。

(5)Forking Cluster
並行調用多個服務器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks=“2” 來設置最大並行數。

(6)Broadcast Cluster
廣播調用所有提供者,逐個調用,任意一臺報錯則報錯 [2]。通常用於通知所有提供者更新緩存或日誌等本地資源信息。

集羣模式配置
按照以下示例在服務提供方和消費方配置集羣模式
<dubbo:service cluster=“failsafe” />

<dubbo:reference cluster=“failsafe” />

5 dubbo整合hystrix進行容錯處理

Hystrix 旨在通過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監控和配置等功能

(1) Provider端和Consumer端 配置spring-cloud-starter-netflix-hystrix
spring boot官方提供了對hystrix的集成,直接在pom.xml里加入依賴(注意版本匹配):

org.springframework.cloud
spring-cloud-starter-netflix-hystrix
2.0.0.RELEASE

(2) 然後在Application類上增加@EnableHystrix來啓用hystrix starter:

Provider端

@EnableHystrix
@EnableDubbo
@SpringBootApplication
public class UserProviderApplication {

	public static void main(String[] args) {
		System.out.println("20882");
		SpringApplication.run(UserProviderApplication.class, args);
	}

}

Consumer端

@EnableDubbo
@EnableHystrix
@SpringBootApplication
public class OrderConsumerApplication {

	public static void main(String[] args) {
		SpringApplication.run(OrderConsumerApplication.class, args);
	}

}

(3)在方法上添加@HystrixCommand

provider端

@Service
public class OrderServiceImpl implements OrderService {

    @Reference
    UserService userService;

    /**
     * 初始化訂單,查詢用戶的所有地址並返回
     * @param userId
     * @return
     * fallbackMethod :容錯回調hello方法
     */
    @HystrixCommand(fallbackMethod = "hello")
    public List<UserAdress> initOrder(String userId){

        return userService.getUserAddressList(userId);
    }

    public List<UserAdress> hello(String userId){
        return Arrays.asList(new UserAdress(1,"123","2","4","183","y"));
    }
}

consumer端
@Service
@Component
public class UserServiceImpl implements UserService {
    @HystrixCommand
    public List<UserAdress> getUserAddressList(String userId){

        UserAdress u1=new UserAdress(1,"ezhou","123","12","15168242649","y");
        UserAdress u2=new UserAdress(1,"ezhou","123","12","15168242649","y");
        if(Math.random()>0.3){
            throw new RuntimeException();
        }

        return Arrays.asList(u1,u2);
    }

}

(4)測試:
正常調用
在這裏插入圖片描述

容錯調用hello方法

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章