從零開始玩轉SpringCloud(三):Feign聲明式服務調用

從零開始玩轉SpringCloud(三):Feign聲明式服務調用

Feign 概述

在開發 Spring Cloud 微服務的時候,服務之間都是以 HTTP 接口的形式對外提供服務的,因此消費者在進行調用的時候,底層就是通過 HTTP Client 的這種方式進行訪問。當然我們可以使用JDK原生的 URLConnection、Apache 的 HTTP Client、Netty 異步 Http Client,Spring 的 RestTemplate 去實現服務間的調用。但是最方便、最優雅的方式是通過 Spring Cloud Open Feign 進行服務間的調用 Spring Cloud 對 Feign 進行了增強,使 Feign 支持 Spring Mvc 的註解,並整合了 Ribbon(負載均衡)、Hystrix(熔斷機制) 等,從而讓 Feign 更加適合SpringCloud微服務開發。

什麼是 Feign

  1. Feign 是一個聲明式的 Web Service 客戶端。它的出現使開發 Web Service 客戶端變得很簡單。使用 Feign 只需要創建一個接口加上對應的註解,比如:@FeignClient 註解。 Feign 有可插拔的註解,包括 Feign 註解和 AX-RS 註解。Feign 也支持編碼器和解碼器,Spring Cloud Open Feign 對 Feign 進行增強支持 Spring Mvc 註解,可以像 Spring Web 一樣使用 HttpMessageConverters 等。
  2. Feign 是一種聲明式、模板化的 HTTP 客戶端。在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 請求訪問遠程服務,就像調用本地方法一樣的,開發者完全感知不到這是在調用遠程方法,更感知不到在訪問 HTTP 請求。接下來介紹一下 Feign 的特性,具體如下:

功能

  • 可插拔的註解支持,包括 Feign 註解和AX-RS註解。
  • 支持可插拔的 HTTP 編碼器和解碼器。
  • 支持 Hystrix 和它的 Fallback。
  • 支持 Ribbon 的負載均衡。
  • 支持 HTTP 請求和響應的壓縮。Feign 是一個聲明式的 WebService 客戶端,它的目的就是讓 Web Service 調用更加簡單。它整合了 Ribbon 和 Hystrix,從而不需要開發者針對 Feign 對其進行整合。Feign 還提供了 HTTP 請求的模板,通過編寫簡單的接口和註解,就可以定義好 HTTP 請求的參數、格式、地址等信息。Feign 會完全代理 HTTP 的請求,在使用過程中我們只需要依賴注入 Bean,然後調用對應的方法傳遞參數即可。

Feign快速使用

  1. 引入依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 項目啓動類加入如下註解:
/** 開啓 Feign 掃描支持 */
@EnableFeignClients 
  1. Feign 接口編寫
/** name指定微服務名稱,path爲類的基路徑*/
@FeignClient(name = "user", path = "/sys/user")
public interface UserFeignSerivce {
    /**
     * 插入user
     *
     * @param record
     * @return
     */
    @PostMapping("/insertUser")
    BaseResult insertUser(User record);
}

}

  1. Feign 接口引用
    @Autowired
    private UserFeignSerivce userFeignSerivce;
    
    @Override
    public BaseResult insert(User record) {
        return userFeignSerivce.insertUser(record);
    }    

Feign 工作原理

  • 在開發微服務應用時,我們會在主程序入口添加 @EnableFeignClients 註解開啓對 Feign Client 掃描加載處理。根據 Feign Client 的開發規範,定義接口並加 @FeignClients 註解。
  • 當程序啓動時,會進行包掃描,掃描所有 @FeignClients 的註解的類,並將這些信息注入 Spring IOC 容器中。當定義的 Feign 接口中的方法被調用時,通過JDK的代理的方式,來生成具體的 RequestTemplate。當生成代理時,Feign 會爲每個接口方法創建一個 RequetTemplate 對象,該對象封裝了 HTTP 請求需要的全部信息,如請求參數名、請求方法等信息都是在這個過程中確定的。
  • 然後由 RequestTemplate 生成 Request,然後把 Request 交給 Client 去處理,這裏指的 Client 可以是 JDK 原生的 URLConnection、Apache 的 Http Client 也可以是 Okhttp。最後 Client 被封裝到 LoadBalanceclient 類,這個類結合 Ribbon 負載均衡發起服務之間的調用。

@FeignClient 註解

  • name:指定 Feign Client 的名稱,如果項目使用了 Ribbon,name 屬性會作爲微服務的名稱,用於服務發現。
  • url:url 一般用於調試,可以手動指定 @FeignClient 調用的地址。
  • decode404:當發生404錯誤時,如果該字段爲 true,會調用 decoder 進行解碼,否則拋出 FeignException。
  • configuration:Feign 配置類,可以自定義 Feign 的 Encoder、Decoder、LogLevel、Contract。
  • fallback:定義容錯的處理類,當調用遠程接口失敗或超時時,會調用對應接口的容錯邏輯,fallback 指定的類必須實現 @FeignClient 標記的接口。
  • fallbackFactory:工廠類,用於生成 fallback 類示例,通過這個屬性我們可以實現每個接口通用的容錯邏輯,減少重複的代碼。
  • path:定義當前 FeignClient 的統一前綴。

Feign 使用注意事項

  1. 使用Spring Cloud Feign,如果接口參數中帶有@PathVariable路徑參數,則要用value=””標明對應的參數,否則會拋出 java.lang.IllegalStateException: PathVariable annotation was empty on param 0. 異常。如:@PathVariable(value = “groupType”) String groupType
  2. 使用Spring Cloud Feign,如果接口參數中帶有@RequestParam參數,@RequestParam 不能省略
  3. 在使用SpringBoot2.1.0以後版本時,多個接口的@FeignClient的name相同,場景調用同一微服務項目,但是不同模塊(Controller),可能會拋出 xx.FeignClientSpecification’, defined in null, could not be registered 異常,解決方案:增加配置spring.main.allow-bean-definition-overriding=true,但會導致@FeignClient的配置覆蓋,或者手動配置FeignClient
    參考文章:https://blog.csdn.net/u012211603/article/details/84312709
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章