Spring Cloud:使用 Feign 實現負載均衡詳解

程式設計師私房菜發表於2019-01-28

Spring Cloud:使用 Feign 實現負載均衡詳解

閱讀文字大概需要 3 分鐘。


前面幾篇文章,對 Ribbon 負載均衡做了詳細的分析,這一節來介紹一下使用 Feign 負載均衡。在介紹之前,我們先來對 Feign 做一下簡單的介紹,先來理解一下什麼是 Feign。

1. Feign 是什麼?

我們看一下官方的解釋:Feign 是一個宣告式 WebService 客戶端。使用 Feign 能讓編寫的 WebService 客戶端更加簡潔,它的使用方法式定義一個介面,然後在上面新增註解。

Spring Cloud 對 Feign 進行了封裝,使其支援了 Spring MVC 標準註解和 HttpMessageConverters。Feign 可以與 Eureka 和 Ribbon 組合使用以支援負載均衡。

2. 為什麼要使用 Feign?

Feign 旨在使編寫 Java Http 客戶端變得更容易。前面在使用 Ribbon + RestTemplate 時,利用 RestTemplate 對 http 請求的封裝處理,形成了一套模板化的呼叫方法。但是在實際開發中,由於對服務依賴的呼叫可能不止一處,往往一個介面會被多處呼叫,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的呼叫

所以,Feign 在此基礎上做了進一步的封裝,由它來幫助我們定義和實現依賴服務介面的定義。使用 Feign 只需要建立一個介面並使用一個註解來配置它即可

這就類似於我們在 dao 層的介面上標註 @Mapper 註解一樣。這樣的話,即完成了對服務提供方的介面繫結,簡化了使用 Spring Cloud Ribbon 時的開發量。我們用例項來說明。

3. Feign 的使用

3.1 依賴匯入

<!--eureka Client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- feign的支援 -->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3.2 啟動類註解配置

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderConsumerFeign {

   public static void main(String[] args) {
       SpringApplication.run(OrderConsumerFeign.class, args);
   }
}

啟動類需要新增註解 @EnableFeignClients,表示啟用 Feign 客戶端。

3.3 Feign 客戶端

我們先來回憶一下,提供訂單的服務名稱為:MICROSERVICE-ORDER,然後訂單服務中提供的兩個獲取訂單資訊的介面url如下:

/**
* feign客戶端
* @author shengwu ni
*/

@FeignClient(value = "MICROSERVICE-ORDER")
public interface OrderClientService {

   @GetMapping("/provider/order/get/{id}")
   TOrder getOrder(@PathVariable(value = "id") Long id);

   @GetMapping("/provider/order/get/list")
   List<TOrder> getAll();
}

可以看到,Feign 客戶端要新增 @FeignClient 註解,value 屬性表示作用到哪個微服務上,這裡表示負載均衡作用到請求訂單服務上。要記住,Feign 也是客戶端的負載均衡。

方法內定義了兩個介面,介面上即和普通的 SpringMVC 沒什麼區別,url 即訂單提供服務的url。這就是 Feign 客戶端,透過註解 + 介面的方式來和訂單服務的介面繫結。

3.4 Feign 客戶端的使用

定義好了 Feign 客戶端介面後,我們就可以在程式碼裡透過 @Resource 正常引入進來,然後透過普通的方法呼叫即可實現對訂單服務的呼叫,如下:

@RestController
@RequestMapping("/consumer/order")
public class OrderConsumerController {

   /**
    * 上面定義的 Feign Client
    */

   @Resource
   private OrderClientService orderClientService;

   @GetMapping("/get/{id}")
   public TOrder getOrder(@PathVariable Long id) {
       return orderClientService.getOrder(id);
   }

   @GetMapping("/get/list")
   public List<TOrder> getAll() {
       return orderClientService.getAll();
   }
}

啟動 eureka 叢集、三個訂單提供服務和這個帶有 Feign 的服務消費方(埠 9001)。透過在瀏覽器中訪問:可以看到,輪流訪問三個訂單服務。說明 Feign 預設是整合了 Ribbon 的輪詢方案。

4. Feign 如何結合 Ribbon 切換均衡演算法

以上就是 Feign 的使用,很簡單,也符合我們平時的介面呼叫習慣。但是這是預設的輪詢負載均衡演算法。在上一節我們知道,Ribbon 中支援很多自帶的均衡演算法,我們只要在程式碼中根據具體情況,選擇合適的均衡演算法即可。甚至我們可以選擇自己自定義的均衡演算法。

那麼使用 Feign 的時候,如何去切換到 Ribbon 中其他均衡策略呢?甚至切換到自定義的策略呢?

也很簡單,我們可以在 application.yml 配置檔案中來指定,如下:

# feignribbon結合,指定策略。feign預設的是輪詢的策略,這裡的配置可以自定義
MICROSERVICE-ORDER:
 ribbon:
   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

MICROSERVICE-ORDER 表示作用到哪個微服務,com.netflix.loadbalancer.RandomRule 即前面介紹 Ribbon 時裡面的隨機策略,當然,我們也可以指定為其他策略,包括我們自己定義的,只要把相應的包路徑寫到這即可,很方便。

重新啟動一下服務消費方的程式,訪問上面那個測試 url,可以看到三個訂單服務是隨機呼叫的,說明配置生效。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558358/viewspace-2565058/,如需轉載,請註明出處,否則將追究法律責任。

相關文章