1. 程式人生 > 其它 >SpringCloud Ribbon(二)之自定義負載均衡規則

SpringCloud Ribbon(二)之自定義負載均衡規則

技術標籤:Spring Cloud

一、Ribbon負載均衡規則

一個服務對應一個LoadBalancer,一個LoadBalancer只有一個Rule,LoadBalancer記錄服務的註冊地址,Rule提供從服務的註冊地址中找出一個地址的規則。

二、 自定義負載均衡規則

本文自定義負載均衡規則提供根據指定URI優先轉發到特定的機器的功能。

三、實現程式碼

(1)負載均衡規則實現類

public class MicroServiceLoadBalanceRule extends AbstractLoadBalancerRule {

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    @Override
    public Server choose(Object key) {

        ILoadBalancer lb = getLoadBalancer();
        if (lb == null) {
            return null;
        }

        List<Server> servers = lb.getReachableServers();
        if (servers.isEmpty()){
            return null;
        }

        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String uri = request.getRequestURI();
        boolean specialApi = uri.startsWith("/api") ;
        // /api路徑優先轉發到指定的機器
        if(specialApi){
            String ip = "192.168.2.3";
            Server chooseServer = null;
            for (Server server : servers) {
                if (server.getHost().equals(ip)) {
                    chooseServer = server;
                }
            }

            if(chooseServer == null){
                chooseServer = servers.stream().findFirst().orElse(null);
            }
            return chooseServer;
        }

        return servers.get(new Random().nextInt(servers.size()));
    }
}

(2)application.yaml檔案

micro-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.mk.springcloud.gateway.loadbalance.MicroServiceLoadBalanceRule