SpringCloud實戰之路 | 應用篇(二)負載均衡Ribbon
負載均衡
負載均衡一般分爲服務端負載均衡與客戶端負載均衡
- 服務端負載均衡: 比如nginx,F5等,請求到達服務器後由這些負載均衡器根據一定的算法將請求路由到目標服務器處理
- 客戶端負載均衡: 比如Ribbon服務消費者會有一個服務器地址列表,調用方在請求前通過負載均衡算法選擇一個服務器訪問,負載均衡算法實在請求客戶端進行
Ribbon是Netflix發佈的負載均衡器,Eureka一般配合Ribbon進行使用,Ribbon利用Eureka中讀取到的服務信息,在調用服務器提供者提供的服務時,會根據一定算法進行負載。
Ribbon應用
Ribbon無需引用額外jar,因爲在服務消費者中已經引入過eureka-client,他其中包含了Ribbon相關的jar包
代碼中使用只需要在RestTemplate加上對應註解即可
@Bean
// Ribbon負載均衡
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
通過返回端口號來觀察負載均衡情況
@RestController
@RequestMapping("/test")
public class TestController {
//獲取服務實例端口
@Value("${server.port}")
private Integer port;
//通過返回端口號來觀察負載均衡情況
@GetMapping("getPort")
public Integer getPort(){
return port;
}
}
測試類
@Test
public void testRibbon(){
Integer forObject = restTemplate.getForObject("http://cloud-service-user/test/getport",Integer.class);
System.out.println(forObject);
}
Ribbon負載均衡策略
Ribbon內置多種負載均衡策略,內部負載均衡策略頂級接口爲 com.netflix.loadbalancer.IRule
Ribbon的默認負載均衡策略是ZoneAvoidanceRule(區域權衡策略),而不是輪詢策略。
負載均衡策略 | 描述 |
---|---|
RoundRobinRULE(輪詢策略) | 默認超過10次獲取到的server都不可用,會返回一個空的server |
RandomRule(隨機策略) | 如果隨機到的server爲null或者不可用的話,會while不停循環選取 |
RetryRule(重試策略) | 一定時限內循環重試。默認繼承RoundRobinRule也支持自定義注入,RetryRule會在每次選取之後,對選舉的server進行判斷,是否爲null,是否爲alive,並在500ms內會不停的選取判斷,而RoundRobinRule失效的策略是超過10次,RandomRule是沒有失效時間的概念,只要serverList沒都掛 |
BestAvailableRule(最小連接數策略) | 遍歷severList,選取可用的且連接數最小的一個server。該算法裏面有一個LoadBalancerStats的成員變量,會存儲所有server的運行狀情況和連接數。如果選取到的server爲null,那麼會調用RoundRobinRule重新選取 |
AvailabilityFilteringRule(可用過濾策略) | 擴展了輪詢策略,會先通過默認的輪詢策略選取一個server,再去判斷該server是否超時可用,當前連接數是否超限,都成功再返回 |
ZoneAvoidanceRule(區域權衡策略策略/默認測試) | 擴展了輪詢策略,繼承了兩個過濾器:ZoneAvoidancePredicate和AvailabilityPredicate,除了過濾器超時和鏈接數過多的server,還會過濾掉不符合要求的zone區域裏面的所有節點,AWS-ZONE在一個區域/機房內的服務實例中輪詢 |
修改配置負載均衡策略
#針對的被調⽤⽅微服務名稱,不加就是全局⽣效
cloud-service-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #負載策略調整
Ribbon工作原理
當我們訪問http://cloud-service-user/test/getport
的時候ribbon會根據服務名獲取到該服務的實例列表,然後按照負載均衡策略從實例列表中獲取一個實例Server,最終完成請求訪問