Feign调用实现自定义负载均衡(一致性哈希策略)

620 阅读1分钟

前言:Feign负载均衡本身也是基于ribbon

  1. 微服务创建相关接口和FeignClient,实现服务之间的调用 略

  2. 创建自定义负载均衡并继承AbstractLoadBalancerRule

    1. 实现具体的choose方法
    2. 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;
    }

  3. 配置文件中,指定对应服务通过feign调用时的负载均衡策略

    [servicename].ribbon.NFLoadBalancerRuleClassName=com....自定义负载均衡类 (这里也可根据业务指定已有的轮询,随机等策略)