天天看點

Dubbo負載均衡政策Dubbo負載均衡政策

Dubbo負載均衡政策

在分布式環境中,一般都有多個提供者服務,形成一個叢集,在多個提供者的環境下,每次調用服務使用哪個提供者,這就涉及分布式的負載均衡政策,Dubbo為我們提供了四種負載均衡政策,分别是随機,輪詢,最小活躍以及一緻性Hash

為了測試,我們建立一個服務提供者,用于查詢使用者位址,并且記錄是哪個提供者,以及被調用的次數和調用的參數,在測試的時候,啟動多個提供者來測試不同負載均衡政策下的調用效果

@Service
@DubboService
@Slf4j
public class UserServiceImpl implements UserService {

    private static int count = 0;
    
    @Override
    public List<UserAddress> getUserAddressList() {
        UserAddress userAddress1 = new UserAddress(1, "HZ", "00000", "小王", "15652211111", "1");
        UserAddress userAddress2 = new UserAddress(2, "BJ", "00001", "小張", "17911111111", "1");
        return Arrays.asList(userAddress1, userAddress2);
    }

    @Override
    public UserAddress getUserAddress(String userId) {
        count++;
        log.info("1号提供者,調用次數:{},查詢id:{}", count,userId);
        List<UserAddress> userAddressList = getUserAddressList();
        for (UserAddress userAddress : userAddressList) {
            if (userAddress.getUserId().equals(userId)) {
                return userAddress;
            }
        }
        return null;
    }
}
           

然後建立一個消費者用于調用服務

@Service
public class OrderServiceImpl implements OrderService {

    @DubboReference
    UserService userService;

    @Override
    public UserAddress initOrder(String userId) {
        return userService.getUserAddress(userId);
    }
}
           

随機

預設的負載均衡政策是随機,也就是在所有提供者中随機選一個來調用。随着調用次數的增加,所有提供者被調用到的次數趨近于等分,或者設定的權重比例

設定Dubbo的負載均衡政策,可以在

@DubboService

注解的loadbalance屬性設定,比如設定為随機調用,隻需要以下配置

@Service
@DubboService(loadbalance = "random")
public class UserServiceImpl implements UserService {

}
           

同樣也可以配置在配置檔案中或者消費者服務中

輪詢

輪詢就是在提供者中,按次序選擇,依次周遊調用。如果加上權重,則在低權重值的提供者的調用次數達到權重比例時,将之剔除出輪詢,在剩下的提供者中繼續輪詢,直到所有提供者的調用次數都達到權重比例,重置輪詢

設定Dubbo的負載均衡政策為輪詢,隻需要在

@DubboService

注解的loadbalance屬性設定為roundrobin

輪詢政策有請求積壓的缺點,在Dubbo官方文檔中也有指出

存在慢的提供者累積請求的問題,比如:第二台機器很慢,但沒挂,當請求調到第二台時就卡在那,久而久之,所有請求都卡在調到第二台上

最小活躍

最小活躍政策的效果是,在每次請求的時候檢視所有的提供者之前被調用的接口耗時,耗時越長,則被調用的機率越低,也就是選擇耗時短的提供者

可以通過設定loadbalance屬性設定為leastactive來設定最小活躍政策

權重

在使用随機政策或者輪詢政策的時候,我們可以給每個提供者配置設定不同的權重,權重越高則被調用的機率越大

設定Dubbo的負載均衡權重,可以通過設定

@DubboService

注解的weight屬性

@Service
@DubboService(weight = 300)
public class UserServiceImpl implements UserService {

}
           

現在我們啟動三台提供者,分别設定他們的權重為300,100,100,政策為預設的随機政策,測試檢視效果

Dubbo負載均衡政策Dubbo負載均衡政策
Dubbo負載均衡政策Dubbo負載均衡政策
Dubbo負載均衡政策Dubbo負載均衡政策

可以看到三個提供者的被調用比例大約為3:1:1

一緻性Hash

一緻性Hash政策的效果是按照參數的不同請求不同的提供者,相同參數隻會請求同一個提供者

設定loadbalance屬性設定為consistenthash,然後啟動兩個提供者,查詢不同的使用者id的位址資訊,看調用了哪個提供者

Dubbo負載均衡政策Dubbo負載均衡政策
Dubbo負載均衡政策Dubbo負載均衡政策

從結果可以看出,查詢00000隻會調用2号提供者,查詢00001隻會調用1号提供者

繼續閱讀