zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    不使用border-radius,实现一个可复用的高度和宽度都自适应的圆角矩形
    实现一个div在浏览器水平居中
    HTML画布(2)
    《10X工作法制》笔记
    消息体的上传格式
    在rpc链路中的工作总结
    同属姓名注入spring报错
    《事实》听后感
    jdk8使用stream对指定值去重以及其他stream用法
    如何写好业务(待续)
  • 原文地址:https://www.cnblogs.com/niulang85/p/5793900.html
Copyright © 2011-2022 走看看