我想创建一个虚拟负载均衡器。 为了尽可能避免错误,我直接扩展了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);
}
这是第一个通话情况
但第二通电话情况 仅获取促销中心的服务器信息