【夯實Spring Cloud】Spring Cloud中使用Feign實現負載均衡詳解

本文屬於【夯實Spring Cloud】系列文章,該系列旨在用通俗易懂的語言,帶大家瞭解和學習Spring Cloud技術,希望能給讀者帶來一些乾貨。系列目錄如下:

【夯實Spring Cloud】Dubbo沉睡5年,Spring Cloud開始崛起!
【夯實Spring Cloud】Spring Cloud中基於maven的分佈式項目框架的搭建
【夯實Spring Cloud】Spring Cloud中的Eureka服務註冊與發現詳解
【夯實Spring Cloud】Spring Cloud中如何完善Eureka中的服務信息
【夯實Spring Cloud】Spring Cloud中使用Eureka集羣搭建高可用服務註冊中心
【夯實Spring Cloud】Spring Cloud中的Eureka和Zookeeper的區別在哪?
【夯實Spring Cloud】Spring Cloud中使用Ribbon實現負載均衡詳解(上)
【夯實Spring Cloud】Spring Cloud中使用Ribbon實現負載均衡詳解(下)
【夯實Spring Cloud】Spring Cloud中自定義Ribbon負載均衡策略
【夯實Spring Cloud】Spring Cloud中使用Feign實現負載均衡詳
【夯實Srping Cloud】Spring Cloud中使用Hystrix實現斷路器原理詳解(上)
【夯實Srping Cloud】Spring Cloud中使用Hystrix實現斷路器原理詳解(下)(正在寫……)
【夯實Spring Cloud】Spring Cloud中使用Zuul實現路由網關詳解(正在寫……)
【夯實Spring Cloud】Spring Cloud分佈式配置中心詳解(正在寫……)
【夯實Spring Cloud】未完待續


前面幾篇文章,對 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)。通過在瀏覽器中訪問:http://localhost:9001//consumer/order/get/1 可以看到,輪流訪問三個訂單服務。說明 Feign 默認是集成了 Ribbon 的輪詢方案。

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

以上就是 Feign 的使用,很簡單,也符合我們平時的接口調用習慣。但是這是默認的輪詢負載均衡算法。在上一節我們知道,Ribbon 中支持很多自帶的均衡算法,我們只要在代碼中根據具體情況,選擇合適的均衡算法即可。甚至我們可以選擇自己自定義的均衡算法。

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

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

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

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

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


源碼下載地址:https://gitee.com/eson15/springcloud_study
更多優質文章請關注我的微信公衆號【程序員私房菜】,回覆“資源”和“架構”可以領取優質的視頻學習資源。
程序員私房菜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章