自定义假负载平衡

时间:2018-07-16 06:57:31

标签: spring-cloud spring-cloud-feign netflix-ribbon

我想创建一个虚拟负载均衡器。 为了尽可能避免错误,我直接扩展了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;    }}

但是,当我执行死刑时,结果却出乎意料。

在此getLoadBalancer()方法中, 我发现每次调用获得的ILoadBalancer对象中的服务器都是相同的。 我做了两个实验,我做了两个实验,第一次是正常的,但是第二次结果却不是我预期的。

我用假装以一种方法呼叫用户中心和促销中心。

public void relateDoctorToCard(VipCardRelateDoctorParam relateDoctorParam) {
   // transfer user-center
    DoctorInfoDTO doctorInfoDTO = doctorInfoClient.getDoctorInfo(new DoctorInfoParam());
   // transfer promotion-center
    Integer count = vipCardBindClient.countVipCard(relateDoctorParam);
}

这是第一个通话情况

enter image description here

enter image description here

但第二通电话情况 仅获取促销中心的服务器信息

0 个答案:

没有答案