Ribbon在工作時分為兩步:
第一步:先選擇 EurekaServer,它優先選擇在同一個區域內負載較少的Server;
第二步:再根據用戶指定的策略,在從Server取到的服務注冊列表中選擇一個地址;
其中Ribbon提供了多種策略,比如輪詢、隨機、根據響應時間加權。
一、Ribbon算法的介紹
Ribbon的源碼地址:https://github.com/Netflix/ribbon
IRule:根據特定算法中從服務器列表中選取一個要訪問的服務,Ribbon默認的算法為輪詢算法;
Ribbon中的7中負載均衡算法:
(1)RoundRobinRule:輪詢;
(2)RandomRule:隨機;
(3)AvailabilityFilteringRule:會先過濾掉由於多次訪問故障而處於斷路器狀態的服務,還有並發的連接數量超過閾值的服務,然后對剩余的服務列表按照輪詢策略進行訪問;
(4)WeightedResponseTimeRule:根據平均響應時間計算所有服務的權重,響應時間越快的服務權重越大被選中的概率越大。剛啟動時如果統計信息不足,則使用RoundRobinRule(輪詢)策略,等統計信息足夠,會切換到WeightedResponseTimeRule;
(5)RetryRule:先按照RoundRobinRule(輪詢)策略獲取服務,如果獲取服務失敗則在指定時間內進行重試,獲取可用的服務;
(6)BestAvailableRule:會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然后選擇一個並發量最小的服務;
(7)ZoneAvoidanceRule:復合判斷Server所在區域的性能和Server的可用性選擇服務器;
ribbion的負載均衡算法結構:
二、配置指定的負載均衡算法
1、打開消費者工程,增加如下的配置:
@Configuration public class ConfigBean { @Bean @LoadBalanced //Ribbon 是客戶端負載均衡的工具;
public RestTemplate getRestTemplate() { return new RestTemplate(); } //配置負載均衡的策略為隨機,默認算法為輪詢算法 @Bean public IRule myRule() { //return new RoundRobinRule(); return new RandomRule(); } }
2、啟動類增加 @EnableEurekaClient 注解
@SpringBootApplication @EnableEurekaClient //本服務啟動后自動注冊到eureka中
public class DeptProvider8001_App { public static void main(String[] args) { SpringApplication.run(DeptProvider8001_App.class, args); } }
3、然后重啟這個消費者服務,訪問:http://localhost/consumer/dept/get/1;查看到隨機訪問到3個生產者服務。