| 
                         相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 
    - 基于 invokers 集合,根据对象内存地址来计算定义哈希值
 
    - 获得 ConsistentHashSelector 对象。若为空,或者定义哈希值变更(说明 invokers 集合发生变化),进行创建新的  ConsistentHashSelector 对象
 
    - 调用ConsistentHashSelector对象的select方法
 
 
- 1: public class ConsistentHashLoadBalance extends AbstractLoadBalance { 
 -  2:  
 -  3: /** 
 -  4: * 服务方法与一致性哈希选择器的映射 
 -  5: * 
 -  6: * KEY:serviceKey + "." + methodName 
 -  7: */ 
 -  8: private final ConcurrentMap<String, ConsistentHashSelector<?>> selectors = new ConcurrentHashMap<String, ConsistentHashSelector<?>>(); 
 -  9:  
 - 10: @SuppressWarnings("unchecked") 
 - 11: @Override 
 - 12: protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) { 
 - 13: String key = invokers.get(0).getUrl().getServiceKey() + "." + invocation.getMethodName(); 
 - 14: // 基于 invokers 集合,根据对象内存地址来计算定义哈希值 
 - 15: int identityHashCode = System.identityHashCode(invokers); 
 - 16: // 获得 ConsistentHashSelector 对象。若为空,或者定义哈希值变更(说明 invokers 集合发生变化),进行创建新的 ConsistentHashSelector 对象 
 - 17: ConsistentHashSelector<T> selector = (ConsistentHashSelector<T>) selectors.get(key); 
 - 18: if (selector == null || selector.identityHashCode != identityHashCode) { 
 - 19: selectors.put(key, new ConsistentHashSelector<T>(invokers, invocation.getMethodName(), identityHashCode)); 
 - 20: selector = (ConsistentHashSelector<T>) selectors.get(key); 
 - 21: } 
 - 22: return selector.select(invocation); 
 - 23: } 
 - 24: } 
 
  
ConsistentHashSelector 一致性哈希选择器                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |