加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

谈谈Dubbo负载均衡是如何实现的?

发布时间:2019-09-10 16:18:42 所属栏目:Windows 来源:程序员界的彭于晏
导读:dubbo的负载均衡全部由AbstractLoadBalance的子类来实现 RandomLoadBalance 随机 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 获取invoker的数量 获取第一个invoker的权重,并复制给f

相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

  1. 基于 invokers 集合,根据对象内存地址来计算定义哈希值
  2. 获得 ConsistentHashSelector 对象。若为空,或者定义哈希值变更(说明 invokers 集合发生变化),进行创建新的 ConsistentHashSelector 对象
  3. 调用ConsistentHashSelector对象的select方法
  1. 1: public class ConsistentHashLoadBalance extends AbstractLoadBalance { 
  2.  2:  
  3.  3: /** 
  4.  4: * 服务方法与一致性哈希选择器的映射 
  5.  5: * 
  6.  6: * KEY:serviceKey + "." + methodName 
  7.  7: */ 
  8.  8: private final ConcurrentMap<String, ConsistentHashSelector<?>> selectors = new ConcurrentHashMap<String, ConsistentHashSelector<?>>(); 
  9.  9:  
  10. 10: @SuppressWarnings("unchecked") 
  11. 11: @Override 
  12. 12: protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) { 
  13. 13: String key = invokers.get(0).getUrl().getServiceKey() + "." + invocation.getMethodName(); 
  14. 14: // 基于 invokers 集合,根据对象内存地址来计算定义哈希值 
  15. 15: int identityHashCode = System.identityHashCode(invokers); 
  16. 16: // 获得 ConsistentHashSelector 对象。若为空,或者定义哈希值变更(说明 invokers 集合发生变化),进行创建新的 ConsistentHashSelector 对象 
  17. 17: ConsistentHashSelector<T> selector = (ConsistentHashSelector<T>) selectors.get(key); 
  18. 18: if (selector == null || selector.identityHashCode != identityHashCode) { 
  19. 19: selectors.put(key, new ConsistentHashSelector<T>(invokers, invocation.getMethodName(), identityHashCode)); 
  20. 20: selector = (ConsistentHashSelector<T>) selectors.get(key); 
  21. 21: } 
  22. 22: return selector.select(invocation); 
  23. 23: } 
  24. 24: } 

ConsistentHashSelector 一致性哈希选择器

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读