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,政策為預設的随機政策,測試檢視效果
可以看到三個提供者的被調用比例大約為3:1:1
一緻性Hash
一緻性Hash政策的效果是按照參數的不同請求不同的提供者,相同參數隻會請求同一個提供者
設定loadbalance屬性設定為consistenthash,然後啟動兩個提供者,查詢不同的使用者id的位址資訊,看調用了哪個提供者
從結果可以看出,查詢00000隻會調用2号提供者,查詢00001隻會調用1号提供者