日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring Cloud 入门 之 Ribbon 篇(二)

發(fā)布時(shí)間:2025/3/16 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cloud 入门 之 Ribbon 篇(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

上一篇《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)目列表如下:

服務(wù)實(shí)例端口描述
common-api-公用的 api,如:實(shí)體類
eureka-server9000注冊(cè)中心(Eureka 服務(wù)端)
goods-server8081商品服務(wù)(Eureka 客戶端)
goods-server-028082商品服務(wù)(Eureka 客戶端)
goods-server-038083商品服務(wù)(Eureka 客戶端)
order-server8100訂單服務(wù)(Eureka 客戶端)

在 order-server 項(xiàng)目中:

  • 添加依賴:
  • <dependencies> <!-- common api --> <dependency> <groupId>com.extlight.springcloud</groupId> <artifactId>common-api</artifactId> <version>${parent-version}</version> </dependency><!-- springmvc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency><!-- eureka 客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency><!-- ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies>

    添加加 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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。