自定義負載均衡策略
官方文檔指出:自定義的負載均衡配置類不能放在 @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
