Closed
Description
我曾经在项目中使用书中说的方法去配置全局负载均衡策略的时候发现这种配置方式无法得到预期的效果。
自定义的负载均衡服务继承AvailabilityFilteringRule去重写了选择服务器的方法
@Bean
public IRule rule() {
return new RibbonRule();
}
public class RibbonRule extends AvailabilityFilteringRule {
@Override
public Server choose(Object key) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// Get the actual ip address
key = RequestUtils.getIpAddress(request);
ILoadBalancer lb = getLoadBalancer();
Server returnServer = null;
List<Server> server = getPredicate().getEligibleServers(lb.getAllServers(), String.valueOf(key));
for (Server s : server) {
if (StringUtils.contains(s.getHost(), String.valueOf(key))) {
returnServer = s;
}
}
if (returnServer == null) {
returnServer = super.choose(key);
}
return returnServer; }}
这种配置方式在只请求第一次的场景下不会有任何问题,但是在第二次请求的时候ILoadBalancer没有办法获取到正确的服务器导致请求失败
我在init方法中同时去请求了a-center和b-center两个微服务,第一次没问题,第二次请求a-center的feign获取到的是b-center的IP地址
public void init() {
//a-center
a.getA();
//b-center
b.getB();
}
在Ribbon的文档给的案例上配置全局负载均衡是通过@RibbonClients这个注解的defaultConfiguration属性来实现的
@RibbonClients(defaultConfiguration = RibbonRule.class)
public class RibbonClientConfiguration {
}
所以~~~~我想知道是哪里的问题
Metadata
Metadata
Assignees
Labels
No labels