spring cloud 之 Ribbon

1.Ribbon 是什麼

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

2. 什麼是負載均衡

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

3. 負載均衡的種類

3.1 服務端負載均衡

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

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

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

  2. 負載均衡是在客戶端發送請求後進行的,因此客戶端並不知道到底是哪個服務端提供的服務。

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

3.2 客戶端負載均衡

相較於服務端負載均衡,客戶端服務在均衡則是一個比較小衆的概念。如圖:

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

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

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

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

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

4. 服務端負載均衡與客戶端負載均衡對比

RSdMJY

5. Ribbon 的使用

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

<!--Spring Cloud Ribbon 依賴-->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced  //開啓負載均衡
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
@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 配合使用輕鬆地實現客戶端的負載均衡。Ribbon 會先從 Eureka Server(服務註冊中心)去獲取服務端列表,然後通過負載均衡策略將請求分攤給多個服務端,從而達到負載均衡的目的。Spring Cloud Ribbon 提供了一個 IRule 接口,該接口主要用來定義負載均衡策略,它有 7 個默認實現類,每一個實現類都是一種負載均衡策略。

eGJC4Y

7. 更換負載均衡策略

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

@Configuration
public class ConfigBean {

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

    @Bean
    public IRule myRule() {
        return  new RoundRobinRule();
   }
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/WZ7YsjP9aNAeKKOVqMSxcA