前言:Feign负载均衡本身也是基于ribbon
-
微服务创建相关接口和FeignClient,实现服务之间的调用 略
-
创建自定义负载均衡并继承AbstractLoadBalancerRule
- 实现具体的choose方法
- choose方法进行一致性哈希逻辑(需添加guava依赖)大致代码
// 获取接口参数id,用于计算hash值
ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String id = request.getParameter("id");
...
// 获取所有server
List unmodifiedServers = lb.getAllServers();
List servers = new ArrayList<>(unmodifiedServers);
List allServers = servers.stream().sorted(Comparator.comparing(Server::getId)) .collect(Collectors.toList());
int serverCount = allServers.size();
// 获取hashcode,进行一致性哈希,选择对应server,如果server不可用则需要进行循环顺延下一个server
int hashCode = Math.abs(gatewayKey.hashCode());
nextServerIndex = Hashing.consistentHash(hashCode, serverCount);
server = (Server) allServers.get(nextServerIndex % allServers.size());
if (isServerAvailable(server)) {
return server;
} -
配置文件中,指定对应服务通过feign调用时的负载均衡策略
[servicename].ribbon.NFLoadBalancerRuleClassName=com....自定义负载均衡类 (这里也可根据业务指定已有的轮询,随机等策略)