自定義Ribbon的負載均衡策略

自定義負載均衡策略

官方文檔指出:自定義的負載均衡配置類不能放在 @componentScan 所掃描的當前包下及其子包下,不然咱們自定義的這個配置類就會被全部的Ribbon客戶端所共享,也就是說咱們達不到特殊化定製的目的了;算法

 

要求自定義的算法:依舊是輪詢策略,可是每一個服務器被調用5次後輪到下一個服務,即之前是每一個服務被調用1次,如今是每一個被調用5次。spring

 

打開消費者工程:服務器

1、自定義算法類必須繼承 AbstractLoadBalanceRuleapp

啓動類在com.yufeng.springcloud 包下,因此咱們新建一個包: con.yufeng.myrule,並在該包下新建一個類:CustomeRule 負載均衡

public class CustomeRule extends AbstractLoadBalancerRule { /* total = 0 // 當total==5之後,咱們指針才能往下走, index = 0 // 當前對外提供服務的服務器地址, total須要從新置爲零,可是已經達到過一個5次,咱們的index = 1 */

    private int total = 0;             // 總共被調用的次數,目前要求每臺被調用5次
    private int currentIndex = 0;    // 當前提供服務的機器號

    public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { return null; } Server server = null; while (server == null) { if (Thread.interrupted()) { return null; } List<Server> upList = lb.getReachableServers(); //當前存活的服務
            List<Server> allList = lb.getAllServers();  //獲取所有的服務

            int serverCount = allList.size(); if (serverCount == 0) { return null; } //int index = rand.nextInt(serverCount); //server = upList.get(index);
            if(total < 5) { server = upList.get(currentIndex); total++; }else { total = 0; currentIndex++; if(currentIndex >= upList.size()) { currentIndex = 0; } } if (server == null) { Thread.yield(); continue; } if (server.isAlive()) { return (server); } // Shouldn't actually happen.. but must be transient or a bug.
            server = null; Thread.yield(); } return server; } @Override public Server choose(Object key) { return choose(getLoadBalancer(), key); } @Override public void initWithNiwsConfig(IClientConfig clientConfig) { } }

二、主啓動類添加 @RibbonClient 註解,name和configuration參數很重要;ide

在啓動該微服務的時候就能去加載咱們自定義的Ribbon配置類,從而使配置生效:微服務

  @RibbonClient(name="microservicecloud-dept", configuration=CustomeRule .class)spa

  name指定針對哪一個服務 進行負載均衡,而configuration指定負載均衡的算法具體實現類。指針

三、啓動該消費者服務,而後訪問:http://localhost/consumer/dept/get/1,能夠看到先訪問生產者1服務5次,而後訪問生產者2服務5次......code

相關文章
相關標籤/搜索