SpringCloud入門—RIbbon負載均衡
一、介紹
-
背景
當系統面臨大量的使用者通路,負載過高的時候,通常會增加伺服器數量來進行橫向擴充(叢集),多個伺服器的負載需要均衡,以免出現伺服器負載不均衡,部分伺服器負載較大,部分伺服器負載較小的情況。通過負載均衡,使得叢集中伺服器的負載保持在穩定高效的狀态,進而提高整個系統的處理能力。
二、兩種負載均衡
軟體負載均衡分為:服務端(集中式),用戶端。
服務端負載均衡:在用戶端和服務端中間使用代理,nginx。
用戶端負載均衡:根據自己的情況做負載。Ribbon就是。
用戶端負載均衡和服務端負載均衡最大的差別在于 服務端位址清單的存儲位置,以及負載算法在哪裡。
用戶端負載均衡
在用戶端負載均衡中,所有的用戶端節點都有一份自己要通路的服務端位址清單,這些清單統統都是從服務注冊中心擷取的;
服務端負載均衡
在服務端負載均衡中,用戶端節點隻知道單一服務代理的位址,服務代理則知道所有服務端的位址。
Ribbon使用的是用戶端負載均衡。
而在Spring Cloud中我們如果想要使用用戶端負載均衡,方法很簡單,使用@LoadBalanced注解即可,這樣用戶端在發起請求的時候會根據負載均衡政策從服務端清單中選擇一個服務端,向該服務端發起網絡請求,進而實作負載均衡。
上面幾種負載均衡,硬體,軟體(服務端nginx,用戶端ribbon)。目的:将請求分發到其他功能相同的服務。
手動實作,其實也是它的原理,做事的方法。
手寫用戶端負載均衡
1、知道自己的請求目的地(虛拟主機名,預設是spring.application.name)
2、擷取所有服務端位址清單(也就是系統資料庫)。
3、選出一個位址,找到虛拟主機名對應的ip、port(将虛拟主機名 對應到 ip和port上)。
4、發起實際請求(最樸素的請求)。
三、Ribbon執行個體
Ribbon完成用戶端的負載均衡,過濾掉DOWN的服務。
MainController.class
package com.zhow.eurekaconsumer;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
public class MainController {
//Ribbon負載均衡執行個體類
@Resource
private LoadBalancerClient loadBalancerClient;
@GetMapping("client4")
public String client4() {
//通過Ribbon選擇 不用手動擷取服務清單去選擇
//Ribbon 已經完成一遍過濾把DOWN的服務剔除出去
ServiceInstance instanceInfo = loadBalancerClient.choose("Eureka-provider");
//拼接調用url http://192.168.14.81:8080/hi
String url = "http://" + instanceInfo.getHost() + ":" + instanceInfo.getPort() + "/hi";
System.out.println(url);
//使用RestTemplate 調用執行個體方法
RestTemplate restTemplate = new RestTemplate();
String respStr = restTemplate.getForObject(url, String.class);
//傳回值:hello world
System.out.println(respStr);
return respStr;
}
}
四、負載均衡算法
預設實作:
ZoneAvoidanceRule(區域權衡政策):複合判斷Server所在區域的性能和Server的可用性,輪詢選擇伺服器。
其他規則:
BestAvailableRule(最低并發政策):會先過濾掉由于多次通路故障而處于斷路器跳閘狀态的服務,然後選擇一個并發量最小的服務。逐個找服務,如果斷路器打開,則忽略。
RoundRobinRule(輪詢政策):以簡單輪詢選擇一個伺服器。按順序循環選擇一個server。
RandomRule(随機政策):随機選擇一個伺服器。
AvailabilityFilteringRule(可用過濾政策):會先過濾掉多次通路故障而處于斷路器跳閘狀态的服務和過濾并發的連接配接數量超過閥值得服務,然後對剩餘的服務清單安裝輪詢政策進行通路。
WeightedResponseTimeRule(響應時間權重政策):據平均響應時間計算所有的服務的權重,響應時間越快服務權重越大,容易被選中的機率就越高。剛啟動時,如果統計資訊不中,則使用RoundRobinRule(輪詢)政策,等統計的資訊足夠了會自動的切換到WeightedResponseTimeRule。響應時間長,權重低,被選擇的機率低。反之,同樣道理。此政策綜合了各種因素(網絡,磁盤,IO等),這些因素直接影響響應時間。
RetryRule(重試政策):先按照RoundRobinRule(輪詢)的政策擷取服務,如果擷取的服務失敗則在指定的時間會進行重試,進行擷取可用的服務。如多次擷取某個服務失敗,就不會再次擷取該服務。主要是在一個時間段内,如果選擇一個服務不成功,就繼續找可用的服務,直到逾時。
五、切換負載均衡政策
注解方式
@Bean
public IRule myRule(){
//return new RoundRobinRule();
return new RandomRule();
}
配置檔案
針對服務定ribbon政策:
Eureka-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
注解方法優先級高于配置檔案。