<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          spring cloud 之 Ribbon

          共 5089字,需瀏覽 11分鐘

           ·

          2022-08-09 05:58

          1.Ribbon是什么

          Spring Cloud Ribbon 是一套基于 Netflix Ribbon 實現(xiàn)的客戶端負載均衡和服務(wù)調(diào)用工具Netflix Ribbon 是 Netflix 公司發(fā)布的開源組件,其主要功能是提供客戶端的負載均衡算法和服務(wù)調(diào)用。Spring Cloud 將其與 Netflix 中的其他開源服務(wù)組件(例如 Eureka、Feign 以及 Hystrix 等)一起整合進 Spring Cloud Netflix 模塊中,整合后全稱為 Spring Cloud Netflix Ribbon。Ribbon 是 Spring Cloud Netflix 模塊的子模塊,它是 Spring Cloud 對 Netflix Ribbon 的二次封裝。通過它,我們可以將面向服務(wù)的 REST 模板(RestTemplate)請求轉(zhuǎn)換為客戶端負載均衡的服務(wù)調(diào)用Ribbon 是 Spring Cloud 體系中最核心、最重要的組件之一。它雖然只是一個工具類型的框架,并不像 Eureka Server(服務(wù)注冊中心)那樣需要獨立部署,但它幾乎存在于每一個使用 Spring Cloud 構(gòu)建的微服務(wù)中。Spring Cloud 微服務(wù)之間的調(diào)用,API 網(wǎng)關(guān)的請求轉(zhuǎn)發(fā)等內(nèi)容,實際上都是通過 Spring Cloud Ribbon 來實現(xiàn)的·

          2. 什么是負載均衡

          在任何一個系統(tǒng)中,負載均衡都是一個十分重要且不得不去實施的內(nèi)容,它是系統(tǒng)處理高并發(fā)、緩解網(wǎng)絡(luò)壓力和服務(wù)端擴容的重要手段之一。負載均衡(Load Balance) ,簡單點說就是將用戶的請求平攤分配到多個服務(wù)器上運行,以達到擴展服務(wù)器帶寬、增強數(shù)據(jù)處理能力、增加吞吐量、提高網(wǎng)絡(luò)的可用性和靈活性的目的。通俗來講,將請求按照一定的策略均勻地發(fā)送到集群中的每一個節(jié)點上,保證不會出現(xiàn)某個節(jié)點承載大量請求,其他節(jié)點空閑的情況

          3. 負載均衡的種類

          3.1 服務(wù)端負載均衡

          服務(wù)端負載均衡是最常見的負載均衡方式,如圖:

          服務(wù)端負載均衡是在客戶端和服務(wù)端之間建立一個獨立的負載均衡服務(wù)器,該服務(wù)器既可以是硬件設(shè)備(例如 F5),也可以是軟件(例如 Nginx)。這個負載均衡服務(wù)器維護了一份可用服務(wù)端清單,然后通過心跳機制來刪除故障的服務(wù)端節(jié)點,以保證清單中的所有服務(wù)節(jié)點都是可以正常訪問的。當(dāng)客戶端發(fā)送請求時,該請求不會直接發(fā)送到服務(wù)端進行處理,而是全部交給負載均衡服務(wù)器,由負載均衡服務(wù)器按照某種算法(例如輪詢、隨機等),從其維護的可用服務(wù)清單中選擇一個服務(wù)端,然后進行轉(zhuǎn)發(fā)。服務(wù)端負載均衡具有以下特點:

          1. 需要建立一個獨立的負載均衡服務(wù)器。

          2. 負載均衡是在客戶端發(fā)送請求后進行的,因此客戶端并不知道到底是哪個服務(wù)端提供的服務(wù)。

          3. 可用服務(wù)端清單存儲在負載均衡服務(wù)器上。

          3.2 客戶端負載均衡

          相較于服務(wù)端負載均衡,客戶端服務(wù)在均衡則是一個比較小眾的概念。如圖:

          客戶端負載均衡是將負載均衡邏輯以代碼的形式封裝到客戶端上,即負載均衡器位于客戶端。客戶端通過服務(wù)注冊中心(例如 Eureka Server)獲取到一份服務(wù)端提供的可用服務(wù)清單。有了服務(wù)清單后,負載均衡器會在客戶端發(fā)送請求前通過負載均衡算法選擇一個服務(wù)端實例再進行訪問,以達到負載均衡的目的;客戶端負載均衡也需要心跳機制去維護服務(wù)端清單的有效性,這個過程需要配合服務(wù)注冊中心一起完成。客戶端負載均衡具有以下特點:

          1. 負載均衡器位于客戶端,不需要單獨搭建一個負載均衡服務(wù)器。

          2. 負載均衡是在客戶端發(fā)送請求前進行的,因此客戶端清楚地知道是哪個服務(wù)端提供的服務(wù)。

          3. 客戶端都維護了一份可用服務(wù)清單,而這份清單都是從服務(wù)注冊中心獲取的。

          Ribbon 就是一個基于 HTTP 和 TCP 的客戶端負載均衡器,當(dāng)我們將 Ribbon 和 Eureka 一起使用時,Ribbon 會從 Eureka Server(服務(wù)注冊中心)中獲取服務(wù)端列表,然后通過負載均衡策略將請求分攤給多個服務(wù)提供者,從而達到負載均衡的目的。

          4. 服務(wù)端負載均衡與客戶端負載均衡對比

          不同點服務(wù)端負載均衡客戶端負載均衡
          是否需要建立負載均衡服務(wù)器需要在客戶端和服務(wù)端之間建立一個獨立的負載均衡服務(wù)器。將負載均衡的邏輯以代碼的形式封裝到客戶端上,因此不需要單獨建立負載均衡服務(wù)器。
          是否需要服務(wù)注冊中心不需要服務(wù)注冊中心。需要服務(wù)注冊中心。在客戶端負載均衡中,所有的客戶端和服務(wù)端都需要將其提供的服務(wù)注冊到服務(wù)注冊中心上。
          可用服務(wù)清單存儲的位置可用服務(wù)清單存儲在位于客戶端與服務(wù)器之間的負載均衡服務(wù)器上。所有的客戶端都維護了一份可用服務(wù)清單,這些清單都是從服務(wù)注冊中心獲取的。
          負載均衡的時機先將請求發(fā)送到負載均衡服務(wù)器,然后由負載均衡服務(wù)器通過負載均衡算法,在多個服務(wù)端之間選擇一個進行訪問;即在服務(wù)器端再進行負載均衡算法分配。簡單點說就是,先發(fā)送請求,再進行負載均衡。在發(fā)送請求前,由位于客戶端的服務(wù)負載均衡器(例如 Ribbon)通過負載均衡算法選擇一個服務(wù)器,然后進行訪問。簡單點說就是,先進行負載均衡,再發(fā)送請求。
          客戶端是否了解服務(wù)提供方信息由于負載均衡是在客戶端發(fā)送請求后進行的,因此客戶端并不知道到底是哪個服務(wù)端提供的服務(wù)。負載均衡是在客戶端發(fā)送請求前進行的,因此客戶端清楚的知道是哪個服務(wù)端提供的服務(wù)。

          5. Ribbon的使用

          Ribbon 可以與 RestTemplate(Rest 模板)配合使用,以實現(xiàn)微服務(wù)之間的調(diào)用。RestTemplate 是 Spring 家族中的一個用于消費第三方 REST 服務(wù)的請求框架。RestTemplate 實現(xiàn)了對 HTTP 請求的封裝,提供了一套模板化的服務(wù)調(diào)用方法。通過它,Spring 應(yīng)用可以很方便地對各種類型的 HTTP 請求進行訪問。RestTemplate 針對各種類型的 HTTP 請求都提供了相應(yīng)的方法進行處理,例如 HEAD、GET、POST、PUT、DELETE 等類型的 HTTP 請求,分別對應(yīng) RestTemplate 中的 headForHeaders()、getForObject()、postForObject()、put() 以及 delete() 方法。

          • 引入依賴

          <!--Spring Cloud Ribbon 依賴-->
          <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
          </dependency>
          • 添加RestTemplate Bean聲明

          @Configuration
          public class ConfigBean {

              @Bean
              @LoadBalanced  //開啟負載均衡
              public RestTemplate getRestTemplate() {
                  return new RestTemplate();
              }
          }
          • 調(diào)用

          @RestController
          @RequestMapping("api/v1/service2")
          public class Controller {

             @Autowired
             private RestTemplate restTemplate;

             @GetMapping
             public TestEntity get() {
                 // return restTemplate.getForObject("http://{spring.application.name}{接口路由}", 實體類class);
                    return restTemplate.getForObject("http://service1/api/vi/service1"TestEntity.class);
            }
          }

          6. Ribbon負載均衡策略

          Ribbon 是一個客戶端的負載均衡器,它可以與 Eureka 配合使用輕松地實現(xiàn)客戶端的負載均衡。Ribbon 會先從 Eureka Server(服務(wù)注冊中心)去獲取服務(wù)端列表,然后通過負載均衡策略將請求分攤給多個服務(wù)端,從而達到負載均衡的目的。Spring Cloud Ribbon 提供了一個 IRule 接口,該接口主要用來定義負載均衡策略,它有 7 個默認實現(xiàn)類,每一個實現(xiàn)類都是一種負載均衡策略。

          負載均衡策略說明
          RoundRobinRule按照線性輪詢策略,即按照一定的順序依次選取服務(wù)實例
          RandomRule隨機選取一個服務(wù)實例
          RetryRule按照 RoundRobinRule(輪詢)的策略來獲取服務(wù),如果獲取的服務(wù)實例為 null 或已經(jīng)失效,則在指定的時間之內(nèi)不斷地進行重試(重試時獲取服務(wù)的策略還是 RoundRobinRule 中定義的策略),如果超過指定時間依然沒獲取到服務(wù)實例則返回 null 。
          WeightedResponseTimeRuleWeightedResponseTimeRule 是 RoundRobinRule 的一個子類,它對 RoundRobinRule 的功能進行了擴展。 根據(jù)平均響應(yīng)時間,來計算所有服務(wù)實例的權(quán)重,響應(yīng)時間越短的服務(wù)實例權(quán)重越高,被選中的概率越大。剛啟動時,如果統(tǒng)計信息不足,則使用線性輪詢策略,等信息足夠時,再切換到 WeightedResponseTimeRule。
          BestAvailableRule繼承自 ClientConfigEnabledRoundRobinRule。先過濾點故障或失效的服務(wù)實例,然后再選擇并發(fā)量最小的服務(wù)實例。
          AvailabilityFilteringRule先過濾掉故障或失效的服務(wù)實例,然后再選擇并發(fā)量較小的服務(wù)實例。
          ZoneAvoidanceRule默認的負載均衡策略,綜合判斷服務(wù)所在區(qū)域(zone)的性能和服務(wù)(server)的可用性,來選擇服務(wù)實例。在沒有區(qū)域的環(huán)境下,該策略與輪詢(RandomRule)策略類似。

          7. 更換負載均衡策略

          Spring Cloud Ribbon 默認使用輪詢策略選取服務(wù)實例,我們也可以根據(jù)自身的需求切換負載均衡策略。切換負載均衡策略的方法很簡單,我們只需要在服務(wù)消費者(客戶端)的配置類中,將 IRule 的其他實現(xiàn)類注入到容器中即可。

          @Configuration
          public class ConfigBean {

             @Bean
             @LoadBalanced
              public RestTemplate getRestTemplate() {
                  return new RestTemplate();
             }

              @Bean
              public IRule myRule() {
                  return  new RoundRobinRule();
             }
          }

          記得點「」和「在看」↓

          愛你們

          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  激情综合自拍偷拍 | 五月婷婷亚洲综合 | 国产成人激情视频 | 欧美一级黃色a片免费看视频 | 亚洲小说一区二区 |