1.Ribbon默認使用RoundRobinRule策略輪詢選擇server
策略名 | 策略聲明 | 策略描述 | 實現說明 |
BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule |
選擇一個最小的並發請求的server | 逐個考察Server,如果Server被tripped了,則忽略,在選擇其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 過濾掉那些因為一直連接失敗的被標記為circuit tripped的后端server,並過濾掉那些高並發的的后端server(active connections 超過配置的閾值) | 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個server的運行狀態 |
WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根據響應時間分配一個weight,響應時間越長,weight越小,被選中的可能性越低。 | 一個后台線程定期的從status里面讀取評價響應時間,為每個server計算一個weight。Weight的計算也比較簡單responsetime 減去每個server自己平均的responsetime是server的權重。當剛開始運行,沒有形成status時,使用roubine策略選擇server。 |
RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 對選定的負載均衡策略機上重試機制 | 在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server |
RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | roundRobin方式輪詢選擇server | 輪詢index,選擇index對應位置的server |
RandomRule | public class RandomRule extends AbstractLoadBalancerRule |
隨機選擇一個server |
在index上隨機,選擇index對應位置的server |
ZoneAvoidanceRule |
public class ZoneAvoidanceRule extends PredicateBasedRule |
復合判斷server所在區域的性能和server的可用性選擇server |
使用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個zone的運行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用於過濾掉連接數過多的Server。 |
切換策略
-
-
public class ConfigBean {
-
-
// @Bean
-
// public RestTemplate getRestTemplate() {
-
// return new RestTemplate();
-
// }
-
-
-
-
public RestTemplate getRestTemplate() {
-
return new RestTemplate();
-
}
-
-
-
public IRule myRule()
-
{
-
//return new RoundRobinRule();
-
// return new RandomRule();//達到的目的,用我們重新選擇的隨機算法替代默認的輪詢。
-
return new RetryRule();
-
}
-
}
自定義算法:
配置類(必須不能在啟動類和啟動類下所包含的子包下面)
-
public class RandomRule_ZY extends AbstractLoadBalancerRule
-
{
-
-
// total = 0 // 當total==5以后,我們指針才能往下走,
-
// index = 0 // 當前對外提供服務的服務器地址,
-
// total需要重新置為零,但是已經達到過一個5次,我們的index = 1
-
// 分析:我們5次,但是微服務只有8001 8002 8003 三台,OK?
-
//
-
-
-
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) {
-
/*
-
* No servers. End regardless of pass, because subsequent passes only get more
-
* restrictive.
-
*/
-
return null;
-
}
-
-
// int index = rand.nextInt(serverCount);// java.util.Random().nextInt(3);
-
// server = upList.get(index);
-
-
-
// private int total = 0; // 總共被調用的次數,目前要求每台被調用5次
-
// private int currentIndex = 0; // 當前提供服務的機器號
-
if(total < 5)
-
{
-
server = upList.get(currentIndex);
-
total++;
-
} else {
-
total = 0;
-
currentIndex++;
-
if(currentIndex >= upList.size())
-
{
-
currentIndex = 0;
-
}
-
}
-
-
-
if (server == null) {
-
/*
-
* The only time this should happen is if the server list were somehow trimmed.
-
* This is a transient condition. Retry after yielding.
-
*/
-
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;
-
-
}
-
-
-
public Server choose(Object key)
-
{
-
return choose(getLoadBalancer(), key);
-
}
-
-
-
public void initWithNiwsConfig(IClientConfig clientConfig)
-
{
-
// TODO Auto-generated method stub
-
-
}
-
-
}
-
-
public class MySelfRule {
-
-
public IRule myRule() {
-
// return new RandomRule();// Ribbon默認是輪詢,我自定義為隨機
-
return new RandomRule_ZY();// 我自定義為每台機器5次
-
}
-
}
另一配置類(在啟動類包里面)
-
-
public class ConfigBean {
-
-
// @Bean
-
// public RestTemplate getRestTemplate() {
-
// return new RestTemplate();
-
// }
-
-
-
-
public RestTemplate getRestTemplate() {
-
return new RestTemplate();
-
}
-
-
// @Bean
-
// public IRule myRule()
-
// {
-
// //return new RoundRobinRule();
-
// return new RandomRule();//達到的目的,用我們重新選擇的隨機算法替代默認的輪詢。
-
// return new RetryRule();
-
// }
-
}
啟動類
-
-
-
//在啟動該微服務的時候就能去加載我們的自定義Ribbon配置類,從而使配置生效
-
//@RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class)
-
-
public class DeptConsumer80_App {
-
public static void main(String[] args) {
-
SpringApplication.run(DeptConsumer80_App.class, args);
-
}
-
}
測試效果為每個server執行5次再輪詢
轉自:https://blog.csdn.net/flynn_chen/article/details/80631717