客戶端調用服務端時,如何選擇調用服務端的哪臺機器上的服務呢。這就設計到負載均衡策略了,dubbo給出瞭如下四種策略:
- 隨機模式。按權重設置隨機概率。在一個截面上碰撞的概率較高,但調用越大分佈越均勻
- 輪詢模式。按公約後的權重設置輪詢比例。但存在響應慢的服務提供者會累積請求
- 最少活躍調用數。響應快的提供者接受越多請求,響應慢的接受越少請求
- 一致hash。根據服務提供者ip設置hash環,攜帶相同的參數總是發送的同一個服務提供者,若服務掛了,則會基於虛擬節點平攤到其他提供者上
而且,dubbo的這幾種策略都是通過@SPI方式使用的:
通過LoadBalance我們也知道了,dubbo默認的負載均衡策略是隨機調用法。
package com.alibaba.dubbo.rpc.cluster;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.extension.Adaptive;
import com.alibaba.dubbo.common.extension.SPI;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.RpcException;
import java.util.List;
@SPI("random")
public interface LoadBalance {
@Adaptive({"loadbalance"})
<T> Invoker<T> select(List<Invoker<T>> var1, URL var2, Invocation var3) throws RpcException;
}
那麼,如何改變dubbo的負載均衡策略呢?
1)如果是springboot項目,直接註解在@Reference中引用,然後註明loadblance="xx".其中xx爲每個實現類中的name的值
public class LoadBalanceTest{
@Reference(loadBalance="consistenthash", retries = 3)
private UserService userService;
}
2)xml配置的方式
<dubbo:serviceinterface="..." loadbalance="consistenthash"/>