相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
- 基于 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 一致性哈希选择器
(编辑:ASP站长网)
|