微服務負載均衡元件-Ribbon
阿新 • • 發佈:2020-08-08
什麼是Ribbon
Ribbon是Netflix釋出的開源專案,其主要功能是提供客戶端側負載均衡演算法。Ribbon客戶端元件提供一系列完善的配置項如連線超時,重試等。Ribbon會自動的幫助你基於某種規則(如輪詢,隨機等)去連線這些機器,用時,Ribbon也支援自定義的負載均衡演算法
在SpirngCloud中,Ribbon利用從Eureka中讀取到的服務提供者列表資訊,在呼叫服務節點提供服務時,基於內建的負載均衡演算法,進行服務請求。
Ribbo和Nginx區別
一般實現負載均衡,會有倆個選擇,客戶端負載均衡和服務端的負載均衡
Nginx是服務端負載均衡,負載均衡的策略演算法是在服務端實現的。
Ribbon是客戶端負載均衡,負載均衡演算法是由呼叫者本身進行維護的。
策略
Ribbon內建了多種負載均衡策略,內部負責複雜均衡的頂級介面為
com.netflix.loadbalancer.IRule;
com.netflix.loadbalancer.RoundRobinRule;輪詢策略
com.netflix.loadbalabcer.RandomRule; 隨機策略;
com.netflix.loadbalancer.BestAvailableRule; 最佳可用策略
用法
1.新增pom檔案
<!--Ribbon--> <!-- <dependency>--> <!-- <groupId>org.springframework.cloud</groupId>--> <!-- <artifactId>spring-cloud-starter-ribbon</artifactId>--> <!-- <version>1.4.6.RELEASE</version>--> <!-- </dependency>--> <!--自帶有ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka- client</artifactId> </dependency>
2. 添加註解
@Bean
@LoadBalanced //Ribbon
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
自定義ribbon
1. 重寫方法
public class KuangRandomRule extends AbstractLoadBalancerRule { //每個服務,訪問5次~,換下一個服務(3個) // total=0, 預設=0,如果=5,我們指向下一個服務節點 // index=0,預設0,如果total=5,index+1, private int total = 0; //被呼叫的次數 private int currentIndex = 0; //當前是誰在提供服務~
//@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
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 = chooseRandomInt(serverCount); //生成區間隨機數
// server = upList.get(index); //從活著的服務中,隨機獲取一個~
//-=========================================================
if (total<5){
server = upList.get(currentIndex);
total++;
}else {
total = 0;
currentIndex++;
if (currentIndex>upList.size()){
currentIndex = 0;
}
server = upList.get(currentIndex); //從活著的服務中,獲取指定的服務來進行操作
}
//-=========================================================
if (server == null) {
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
server = null;
Thread.yield();
}
return server;
}
protected int chooseRandomInt(int serverCount) {
return ThreadLocalRandom.current().nextInt(serverCount);
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
// TODO Auto-generated method stub
}
}
2. 注入進去
````java
@Bean
public IRule myRule(){
return new RoundRobinRule(); //預設是輪詢,現在我們定義為~ KuangRandomRule
}
注:一定要寫在主配置外面,不然會被componentscan掃描到。否則,它由所有@RibbonClients共享。如果您使用@ComponentScan(或@SpringBootApplication),則需要採取措施避免將其包括在內(例如,可以將其放在單獨的,不重疊的程式包中,或指定要在@ComponentScan)。