自定義Ribbon的負載均衡策略


自定義負載均衡策略

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

 

要求自定義的算法:依舊是輪詢策略,但是每個服務器被調用5次后輪到下一個服務,即以前是每個服務被調用1次,現在是每個被調用5次。

 

打開消費者工程:

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

啟動類在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) { } }

 2、配置類中增加自定義規則

@Configuration public class ConfigBean { @Bean @LoadBalanced //Ribbon 是客戶端負載均衡的工具;
    public RestTemplate getRestTemplate() { return new RestTemplate(); } @Bean public IRule myRule() { return new CustomeRule(); //自定義負載均衡規則 } }

3、主啟動類添加 @RibbonClient 注解,name和configuration參數很重要;

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

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

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

4、啟動該消費者服務,然后訪問:http://localhost/consumer/dept/get/1,可以看到先訪問生產者1服務5次,然后訪問生產者2服務5次......

 

 

 

ConfigBean


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM