上一篇文章Eureka自我保護機制、健康檢查的作用、actuator模塊監(jiān)控 ,我們簡單學習了服務健康監(jiān)控的一些知識,這篇文章的主題是使用Ribbon實現(xiàn)服務負載均衡。
在學習之前,我們先弄清一個概念,什么叫負載均衡?負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務器、FTP服務器、企業(yè)關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
顯然,度娘已經很完美的解答了這個問題,用大白話解釋就是客戶端在請求數據的時候,其實每次請求的服務器都不一定是相同的。
今天我們來使用Spring Clound Ribbon來實現(xiàn)服務的負載均衡。Ribbon 從屬于Spring Cloud Netflix 項目。
我們仍然以上篇文章中的三個工程為例(Eureka-server,userreg,myweb),為了模擬多節(jié)點,我們先復制userreg工程,命名為userreg2,端口改為9002,其余一模一樣。
我們在myweb工程pom文件中添加如下依賴
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
...
接下來我們只需要在業(yè)務類中,作如下代碼
@RestController
public class Myweb {
@Autowired
DiscoveryClient discoveryClient;
@Autowired
LoadBalancerClient mLoadBalancerClient;
@RequestMapping("/userreg")
public Map userreg() {
// List<ServiceInstance> list = discoveryClient.getInstances("USERREG");
// String serviceUrl = list.get(0).getUri().toString();
/*robbinz負載均衡實現(xiàn)*/
ServiceInstance userreg = mLoadBalancerClient.choose("USERREG");
String serviceUrl = userreg.getUri().toString();
System.out.println(serviceUrl);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(serviceUrl + "/reg", Map.class);
}
}
代碼就是如此簡潔!注入LoadBalancerClient實例,使用LoadBalancerClient實例中的choose方法,根據微服務名稱來獲取服務實例,在這個選擇或者說獲取服務實例的過程中,Robbon內部采用一定的規(guī)則來確定獲取哪個服務實例(默認使用輪詢index,選擇index對應位置的server)。我們多調用幾次http://localhost:9050/userreg接口,我們查看控制臺

如果我們需要自定義規(guī)則要怎么做呢?
其實也很簡單,我們可以先看下ribbon均衡策略有哪些?
| 策略名 | 策略描述 | 實現(xiàn)說明 |
|---|---|---|
| BestAvailableRule | 選擇一個最小的并發(fā)請求的server | 逐個考察Server,如果Server被tripped了,則忽略,在選擇其中ActiveRequestsCount最小的server |
| AvailabilityFilteringRule | 過濾掉那些因為一直連接失敗的被標記為circuit tripped的后端server,并過濾掉那些高并發(fā)的的后端server(active connections 超過配置的閾值) | 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個server的運行狀態(tài) |
| WeightedResponseTimeRule | 根據相應時間分配一個weight,相應時間越長,weight越小,被選中的可能性越低。 | 一 個后臺線程定期的從status里面讀取評價響應時間,為每個server計算一個weight。Weight的計算也比較簡單responsetime 減去每個server自己平均的responsetime是server的權重。當剛開始運行,沒有形成statas時,使用roubine策略選擇 server。 |
| RetryRule | 對選定的負載均衡策略機上重試機制。 | 在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server |
| RoundRobinRule(默認) | roundRobin方式輪詢選擇server | 輪詢index,選擇index對應位置的server |
| RandomRule | 隨機選擇一個server | 在index上隨機,選擇index對應位置的server |
| ZoneAvoidanceRule | 復合判斷server所在區(qū)域的性能和server的可用性選擇server | 使 用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個 zone的運行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于過濾掉連接數過多的 Server。 |
我們如果定義使用隨機RandomRule,我們可以建立一個config類
@Configuration
public class MyConfig {
@Bean
public IRule getRibbonRule() {
return new RandomRule();
}
}
別忘了在類上添加注解@Configuration哦。
好了我們現(xiàn)在重啟一下服務,瘋狂訪問http://localhost:9050/userreg接口,我們看下控制臺

我們發(fā)現(xiàn)ribbon已經幫我們切換了均衡策略,隨機選擇一個服務供調用。
預告我們后面一篇文章使用Feign調用注冊在Eureka中的遠程服務(入門)
作者:簡書
鏈接:http://www.itdecent.cn/p/q81RER
來源:簡書
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。