问题描述
我目前正在通过弹簧使用netflix功能区负载均衡器。
我正在考虑让功能区负载平衡器根据每个请求的ID(UUID)选择主机。
因此对于ID为“ xyz-123”的请求,我始终希望选择服务器1(如果有)。
ID为“ abc-098”的请求将始终选择服务器2(如果有)。
我想我可以通过创建自己的IRule来做到这一点,但是我真的不喜欢那种解决方案,因为看来这样的事情应该已经存在了。而且我什至不确定我能否使其正常工作。
- 是否有更好的方法基于id进行路由?
- 如何以一种好的方式更改和访问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?
- 任何人都知道使用自定义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 (将#修改为@)