功能区负载平衡器基于请求UUID的首选主机对哈希进行一致性哈希处理

问题描述

我目前正在通过弹簧使用netflix功能区负载均衡器。

我正在考虑让功能区负载平衡器根据每个请求的ID(UUID)选择主机。

因此对于ID为“ xyz-123”的请求,我始终希望选择服务器1(如果有)。

ID为“ abc-098”的请求将始终选择服务器2(如果有)。

我想我可以通过创建自己的IRule来做到这一点,但是我真的不喜欢那种解决方案,因为看来这样的事情应该已经存在了。而且我什至不确定我能否使其正常工作。

  1. 是否有更好的方法基于id进行路由?
  2. 如何以一种好的方式更改和访问IRule的密钥?我看到RibbonLoadBalancerClient似乎将键/提示硬编码为null吗?
    @Override
    public ServiceInstance choose(String serviceId) {
        return choose(serviceId,null);
    }

我能找到的最好的是

RequestContext.getCurrentContext()
              .set(FilterConstants.LOAD_BALANCER_KEY,"canary-test");

但这似乎在较新版本中可用,因为不建议使用Spring Cloud Netflix Core?

  1. 任何人都知道使用自定义IRule是否可以解决此问题?

编辑

我用这种方法解决了:

public class IdBasedLoadBalancerRule extends AbstractLoadBalancerRule {
    // Lots of code for getting a Server using a preferred server and retry using RoundRobin
}

public class RibbonLoadBalancerClientContextChooser extends RibbonLoadBalancerClient {
    @Override
    public ServiceInstance choose(String serviceId) {
        return super.choose(serviceId,RibbonClientIdContextHolder.get());
    }
}

public class RestTemplateWithIdRouting extends RestTemplate {
    public void setId(String id) {
        RibbonClientIdContextHolder.set(id);
    }
}

public class RibbonClientIdContextHolder {
    private static final ThreadLocal<String> idContext = new ThreadLocal<>();
}

这行得通...但是我真的不喜欢。.

必须有一些更简单的方法吗?

第二编辑

简而言之...

我想为使用功能区进行一致的哈希创建哈希。

Br, 马库斯

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)