dubbo 負載均衡中策略決策


在dubbo中的服務端負載均衡配置,如果像以下情況,將需要決策最終的負載策略問題:

    <dubbo:application name="hello-world-server"  />
  
    <!-- 用dubbo協議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="roundrobin"/>

    <!-- 用dubbo協議在20881端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20881" />
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="random"/>

   <!-- 用dubbo協議在20882端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20882" />

    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="roundrobin"/>

 

在dubbo中是怎么解決這個問題的呢?

AbstractClusterInvoker.java :

  //在consumer調用服務的入口
212
public Result invoke(final Invocation invocation) throws RpcException { 213 214 checkWheatherDestoried(); 215 216 LoadBalance loadbalance; 217 218 List<Invoker<T>> invokers = directory.list(invocation); 219 if (invokers != null && invokers.size() > 0) {    // 在從directory中取出的所有對應的invoker中,取第一個invoker的loadbalance作為最終的均衡策略,第一個invoker取哪個,看下面的RegistryDirectory 220   loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(invokers.get(0).getUrl() 221    .getMethodParameter(invocation.getMethodName(),Constants.LOADBALANCE_KEY, Constants.DEFAULT_LOADBALANCE)); 222 } else { 223   loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(Constants.DEFAULT_LOADBALANCE); 224 }
225
226   return doInvoke(invocation, invokers, loadbalance);//使用選出的loadbalance進行調用 227 }

 

以Registry Directory 為例, client 端的 RegistryDirectory.java:

 1 public class RegistryDirectory<T> extends AbstractDirectory<T> implements NotifyListener {
 2     //provider變動時更新方法映射
 3     private void refreshInvoker(List<URL> invokerUrls){
 4        ...
 5        Map<String, List<Invoker<T>>> newMethodInvokerMap = toMethodInvokers(newUrlInvokerMap); // 換方法名映射Invoker列表
 6     }
 7 
 8     .....
 9     private Map<String, List<Invoker<T>>> toMethodInvokers(Map<String, Invoker<T>> invokersMap) {
10 
11         // sort and unmodifiable
12         for (String method : new HashSet<String>(newMethodInvokerMap.keySet())) {
13             List<Invoker<T>> methodInvokers = newMethodInvokerMap.get(method);
14             Collections.sort(methodInvokers, InvokerComparator.getComparator());//以provider的URL字母表排序
15             newMethodInvokerMap.put(method, Collections.unmodifiableList(methodInvokers));
16         }
17         return Collections.unmodifiableMap(newMethodInvokerMap);
18     }
19 
20 }

結論:當有多個provider配置了不同的loadbalance策略時,最終會以provider的url的字母排序第一個provider對應的loadbalance策略作為最終的負載均衡策略。

例如 providers 如下:

dubbo://192.168.1.102:20880/com.alibaba.dubbo.demo.DemoService?......loadbalance=roundrobin&methods=sayHello....

dubbo://192.168.1.102:20881/com.alibaba.dubbo.demo.DemoService?.....loadbalance=random&methods=sayHello....

最終的loadbalance為roundrobin。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM