设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

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

发布时间:2019-09-10 12:09 所属栏目:117 来源:程序员界的彭于晏
导读:相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 基于 invokers 集合,根据对象内存地址来计算定义哈希值 获得 ConsistentHa

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

  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 一致性哈希选择器

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读