springcloud-Ribbon-負載均衡元件
阿新 • • 發佈:2019-01-10
Ribbon負載均衡
1.Ribbon簡介
ribbin是Netflix釋出的負載均衡器,有助於控制http和tcp客戶端的行為,為ribbon配置服務提供者列表後,ribbon就可以基於某種負載均衡演算法,自動的幫助服務消費者去請求。ribbon提供了很多的負載均衡演算法例如
- RoundRobinRule(輪詢演算法)
- RandomRule(隨機演算法)
- AvailabilityFilteringRule():會先過濾由於多次訪問故障而處於斷路器跳閘狀態的服務,還有併發的連線數量超過閾值的服務,然後對剩餘的服務列表按照輪詢策略進行訪問
- WeightedResponseTimeRule():根據平均響應的時間計算所有服務的權重,響應時間越快服務權重越大被選中的概率越高,剛啟動時如果統計資訊不足,則使用RoundRobinRule策略,等統計資訊足夠會切換到WeightedResponseTimeRule
- RetryRule():先按照RoundRobinRule的策略獲取服務,如果獲取失敗則在制定時間內進行重試,獲取可用的服務。
- BestAviableRule():會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個併發量最小的服務
在springCloud中,當ribbon和Eureka配和使用時ribbon可以自動獲取服務註冊列表,並基於負載均衡演算法,請求其中的一個服務提供例項
在消費者與服務者之間做了一個Nginx代理,有效的分發請求到同一個服務者叢集,如果將ribbon搭建在服務者一方,沒有任何作用。
2.為消費者整合ribbon
1.ribbon和springcloud的啟動器
注意:如果已經引入了spring-cloud-starter-eureka依賴,其中已經包含了spring-cloud-starter-ribbon,所以不需要再次引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
2.ribbon整合RestTemplate
@Bean @LoadBalanced RestTemplate getRestTemplate(){ return new RestTemplate(); }
3.消費者控制器
@RestController
@RequestMapping("/query")
public class ClientController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/load")
public void loadBalanceTest(String name){
IRule iRule; //該介面管控ribbon負載均衡策略實現類
ServiceInstance instance = loadBalancerClient.choose("EUREKA-PROVIDER");
String host = instance.getHost();
int port = instance.getPort();
URI uri = instance.getUri();
System.out.println(host);
System.out.println(port);
System.out.println(uri);
}
}
服務者叢集1的控制器
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test1")
public String test(String name){
return "xixixi 8763 :"+name;
}
}
服務者叢集2的控制器
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test1")
public String test(String name){
return "xixixi 8764 :"+name;
}
}
4.驗證負載均衡
訪問:http://localhost:8762/query/load?name=hahahaha
得到結果如下:
因為ribbon預設的實現類是輪詢策略,如果要修改如下↓
3.自定義ribbon配置
在消費者配置檔案天新增如下內容,將負載均衡策略指向其他實現類
HI-SERVICE.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
還有其他實現類如下: