javascript
Spring Cloud 入门 之 Ribbon 篇(二)
一、前言
上一篇《Spring Cloud 入門 之 Eureka 篇(一)》?介紹了微服務(wù)的搭建,服務(wù)注冊(cè)與發(fā)現(xiàn)。但在文章中留了一個(gè)小尾巴--如何正確使用 Eureka 進(jìn)行服務(wù)發(fā)現(xiàn)并調(diào)用服務(wù)。
本篇文章將介紹如何使用 Ribbon 完成發(fā)現(xiàn)服務(wù)的調(diào)用以及其負(fù)載均衡的規(guī)則的使用。
二、簡(jiǎn)單介紹
Spring Cloud Ribbon 是基于 Netflix Ribbon 實(shí)現(xiàn)的一套客戶端負(fù)載均衡工具,其主要功能是提供客戶端的軟件負(fù)載均衡算法,將 Netflix 的中間層服務(wù)連接在一起。
其運(yùn)行原理如下圖:
Ribbon 運(yùn)行時(shí)分成 2 個(gè)步驟:
1) 先選擇在同一個(gè)區(qū)域負(fù)載較少的 EurekaServer; 2) 再根據(jù)用戶指定的策略,在從 EurekaServer 中獲取注冊(cè)列表中的服務(wù)信息進(jìn)行調(diào)用。其中,Ribbon 提供多種負(fù)載均衡策略:如輪詢、隨機(jī)、響應(yīng)時(shí)間加權(quán)等。
三、實(shí)戰(zhàn)演練
我們?cè)?order-server 項(xiàng)目的基礎(chǔ)上進(jìn)行修改。不清楚的讀者請(qǐng)先轉(zhuǎn)移至?《Spring Cloud 入門 之 Eureka 篇(一)》?進(jìn)行瀏覽。
此外,筆者額外的創(chuàng)建 2 個(gè) goods-server 項(xiàng)目,即現(xiàn)在有 3 個(gè) goods-server 項(xiàng)目給 order-server 服務(wù)實(shí)現(xiàn)客戶端的負(fù)載均衡調(diào)用。
現(xiàn)在的項(xiàng)目列表如下:
| common-api | - | 公用的 api,如:實(shí)體類 |
| eureka-server | 9000 | 注冊(cè)中心(Eureka 服務(wù)端) |
| goods-server | 8081 | 商品服務(wù)(Eureka 客戶端) |
| goods-server-02 | 8082 | 商品服務(wù)(Eureka 客戶端) |
| goods-server-03 | 8083 | 商品服務(wù)(Eureka 客戶端) |
| order-server | 8100 | 訂單服務(wù)(Eureka 客戶端) |
在 order-server 項(xiàng)目中:
添加加 ribbon 的依賴。
? ? 2. 請(qǐng)求類添加?@LoadBalanced?注解:
@Configuration public class RestConfiguration {@Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }正如上文介紹的,Ribbon 是客戶端負(fù)載均衡工具,所以在 getRestTemplate 方法上添加?@LoadBalanced?注解實(shí)現(xiàn)負(fù)載均衡。
? ? 3. 修改請(qǐng)求地址:
@Service public class OrderServiceImpl implements OrderService{@Autowired private RestTemplate restTemplate;// @Autowired // private DiscoveryClient client;@Override public void placeOrder(Order order) throws Exception{// 獲取商品服務(wù)地址列表 // List<ServiceInstance> list = this.client.getInstances("GOODS"); // String uri = ""; // for (ServiceInstance instance : list) { // if (instance.getUri() != null && !"".equals(instance.getUri())) { // uri = instance.getUri().toString(); // break; // } // } // // Result result = restTemplate.getForObject(new URI(uri + "/goods/goodsInfo/" + order.getGoodsId()), Result.class);Result result = this.restTemplate.getForObject("http://GOODS/goods/goodsInfo/" + order.getGoodsId(), Result.class);if (result != null && result.getCode() == 200) { System.out.println("=====下訂單===="); System.out.println(result.getData()); } }}修改 DiscoveryClient 相關(guān)代碼,使用?GOODS?作為請(qǐng)求商品服務(wù)的請(qǐng)求 URL。
完成上邊 3 個(gè)操作后,啟動(dòng) 3 臺(tái) goods-server 服務(wù) 和 order-server 服務(wù),通過(guò) Postman 進(jìn)行測(cè)試,運(yùn)行結(jié)果如下:
上圖中,通過(guò) 6 次請(qǐng)求返回的商品的端口信息可知,Ribbon 默認(rèn)使用負(fù)載均衡的策略是輪詢,對(duì)服務(wù)進(jìn)行調(diào)用。
四、負(fù)載均衡策略
#?4.1 策略規(guī)則
Ribbon 提供 IRule 接口,該接口定義了如何訪問(wèn)服務(wù)的方法,以下是該接口的實(shí)現(xiàn)類:
1) RoundRobinRule:輪詢,默認(rèn)使用的規(guī)則; 2) RandomRule:隨機(jī); 3) AvailabilityFilteringRule:先過(guò)濾由于多次訪問(wèn)故障而處于斷路器跳閘狀態(tài)以及并發(fā)連接數(shù)量超過(guò)閥值得服務(wù),然后從剩余服務(wù)列表中按照輪詢策略進(jìn)行訪問(wèn); 4) WeightedResponseTimeRule:根據(jù)平均響應(yīng)時(shí)間計(jì)算所有的權(quán)重,響應(yīng)時(shí)間越快服務(wù)權(quán)重越有可能被選中; 5) RetryRule:先按照 RoundRobinRule 策略獲取服務(wù),如果獲取服務(wù)失敗則在指定時(shí)間內(nèi)進(jìn)行重試,獲取可用服務(wù); 6) BestAvailableRule:先過(guò)濾由于多次訪問(wèn)故障而處于斷路器跳閘狀態(tài)的服務(wù),然后選擇并發(fā)量最小的服務(wù); 7) ZoneAvoidanceRule:判斷 server 所在區(qū)域的性能和 server 的可用性來(lái)選擇服務(wù)器。#?4.2 策略使用
在 order-server 項(xiàng)目中:
@Configuration public class RestConfiguration {@Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); }@Bean public IRule testRule() { return new RandomRule(); } }手動(dòng)創(chuàng)建負(fù)載均衡規(guī)則對(duì)象,本次測(cè)試使用的策略是隨機(jī)。
啟動(dòng) order-server 項(xiàng)目后再次使用 Postman 測(cè)試,運(yùn)行結(jié)果如下:
由圖可知,隨機(jī)策略已生效,負(fù)載均衡的策略由輪詢變成了隨機(jī)。
五、案例源碼
Ribbon demo 源碼
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud 入门 之 Ribbon 篇(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: poj 1821(单调队列优化dp)
- 下一篇: 九个Console命令,让 JS 调试更