通过实现 IRule 接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。我们这边只是演示怎么自定义负载策略,所以没写选择的逻辑,直接返回服务列表中第一个服务。具体代码如下所示。

    1. public class MyRule implements IRule {
    2. private ILoadBalancer lb;
    3. @Override
    4. public Server choose(Object key) {
    5. List<Server> servers = lb.getAllServers();
    6. for (Server server : servers) {
    7. System.out.println(server.getHostPort());
    8. }
    9. return servers.get(0);
    10. }
    11. @Override
    12. public void setLoadBalancer(ILoadBalancer lb) {
    13. this.lb = lb;
    14. }
    15. @Override
    16. public ILoadBalancer getLoadBalancer() {
    17. return lb;
    18. }
    19. }

    Spring Cloud 中,可通过配置的方式使用自定义的负载策略,ribbon-config-demo 是调用的服务名称。

    1. ribbon-config-demo.ribbon.NFLoadBalancerRuleClassName=net.biancheng.ribbon_eureka_demo.rule.MyRule

    重启服务,访问调用了其他服务的接口,可以看到控制台的输出信息中已经有了我们自定义策略中输出的服务信息,并且每次都是调用第一个服务。这跟我们的逻辑是相匹配的。