天天看點

微服務架構 | 4.2 基于 Feign 與 OpenFeign 的服務接口調用

目錄

  • 前言
  • 1. OpenFeign 基本知識
    • 1.1 Feign 是什麼
    • 1.2 Feign 的出現解決了什麼問題
    • 1.3 Feign 與 OpenFeign 的差別與對比
  • 2. 在服務消費者端開啟 Feign 支援
    • 2.1 引入 pom.xml 依賴
    • 2.2 在主程式類上添加注解
    • 2.3 在業務接口上添加注解
    • 2.4 在 controller 層調用接口
  • 3. 在服務消費者端開啟 OpenFeign 支援
    • 3.1 引入 pom.xml 依賴
    • 3.2 在主程式類上添加注解
    • 3.3 在業務接口上添加注解
  • 4. OpenFeign 的逾時控制
  • 5. OpenFeign 的日志列印功能
    • 5.1 日志與日志級别
    • 5.2 編寫配置類設定日志級别
    • 5.3 在 yml 檔案裡配置需要開啟日志功能的提供者 Feign 用戶端
    • 5.4 在控制台上檢視日志資訊
  • 最後

參考資料:

《Spring Microservices in Action》

《Spring Cloud Alibaba 微服務原理與實戰》

《B站 尚矽谷 SpringCloud 架構開發教程 周陽》

Feign 是一個聲明式的Web服務用戶端,讓編寫 Web 服務用戶端變得非常容易,隻需建立一個接口并在接口上添加注解即可;

  • Feign 是一個聲明式的 Web 服務用戶端,讓編寫 Web 服務用戶端變得非常容易,隻需建立一個接口并在接口上添加注解即可;
  • Feign 旨在使編寫 Java HTTP 用戶端變得更容易;

  • 上篇《微服務架構 | 4.1 基于 Ribbon 的負載均衡詳解》在使用 Ribbon + RestTemplate 時,利用 RestTemplate 對 http 請求的封裝處理,有一套模版化的調用方法;
  • 但是在實際開發中,由于對服務依賴的調用可能不止一處,往往一個接口會被多處調用,是以通常都會針對每個微服務自行封裝一些用戶端類來包裝這些依賴服務的調用;
  • 是以,Feign 在此基礎上做了進一步封裝,由他來幫助我們定義和實作依賴服務接口的定義;
  • 在 Feign 的實作下,我們隻需建立一個接口并使用注解的方式來配置它(以前是 Dao 接口上面标注 Mapper 注解,現在是一個微服務接口上面标注一個 Feign 注解),即可完成對服務提供方的接口綁定;
  • 簡化了使用 Spring cloud Ribbon 時,自動封裝服務調用用戶端的開發量;

Feign OpenFeign
Feign 是 Spring Cloud 元件中的一個輕量級 RESTful 的 HTTP 服務用戶端。Feign 内置了 Ribbon,用來做用戶端負載均衡,去調用服務注冊中心的服務。Feign 的使用方式是:使用 Feign 的注解定義接口,調用這個接口,就可以調用服務注冊中心的服務; OpenFeign 是 Spring Cloud 在 Feign 的基礎上支援了 SpringMVC 的注解,如 @RequesMapping 等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通過動态代理的方式産生實作類,實作類中做負載均衡并調用其他服務;
2018年以前的項目在使用feign springcloud F 及 F 版本以上基本上使用 openfeign,openfeign 從架構結構上可以看做是2019年 feign 停更後出現版本,可以說大多數新項目在用 openfeign
spring-cloud-starter-feign spring-cloud-starter-openfeign
  • Feign 與 OpenFeign 最大的差別是:前者不支援對 SpringMVC 的注解,而後者支援;
  • Feign 預設支援 Ribbon 負載均衡,而 OpenFeign 又是在 Feign 的基礎上發展而來的;
  • 詳情可以參考下面:《2.3 在業務接口上添加注解》與《3.3 在業務接口上添加注解》;

消費者對 Feign 用戶端的支援示例同《微服務架構 | 4.1 基于 Ribbon 的負載均衡詳解》一篇中:2.4 使用 Netflix Feign 用戶端調用服務部分;

<!--feign-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
           

@EnableFeignClients:表示開啟并使用 Feign 用戶端;

@FeignClient("provider-instance-name") //辨別服務為 feign 的用戶端
public interface ProviderFeignClient {
    //定義端點的路徑和動作
    @RequestMapping( 
            method= RequestMethod.GET,
            value="/providers/{providerId}",
            consumes="application/json")
    //定義傳入端點的參數,該方法可以由用戶端調用以觸發組織服務        
    Provider getProvider(@PathVariable("providerId") String providerId);
}
           
  • 注意:Feign 不支援對 SpringMVC 注解的支援(與 OpenFeign 的最大差別);
  • 接下來完成對業務接口的實作,将接口自動注入 Controller 層并調用接口方法即可;

@RestController
public class ConsumerFeignController{
    @Resource
    private ProviderFeignClient providerFeignClient;

    @GetMapping(value = "/provider/get/{id}")
    public Provider getProviderById(@PathVariable("id") Long id){
        return providerFeignClient.getProviderById(id);
    }
}
           

<!--openfeign-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
           

@EnableFeignClients:表示開啟并使用 Feign 用戶端(同 Feign);

@FeignClient:表示開啟并使用 Feign 用戶端;

@Component
@FeignClient(value = "provider-instance-name")
public interface ProviderFeignClient {
    @GetMapping(value = "/providers/{providerId}")
    Provider getProvider(@PathVariable("providerId") String providerId);
}
           
  • 注意:可以從這裡看到 OpenFeign 對 SpringMVC 注解的支援(與 Feign 的最大差別);
  • 接下來的步驟同 Feign,也是:完成對業務接口的實作,将接口自動注入 Controller 層并調用接口方法即可;
  • 同《2.4 在 controller 層調用接口》;

  • 當用戶端請求超過 1s 是,會報如下錯誤:
  • 這是因為 Feign 用戶端預設隻等待一秒鐘,當請求時間超過 1s 時,Feign 會給我們傳回請求逾時頁面;
  • 隻需修改 yml 檔案即可修改預設逾時控制;
#設定 feign/openFeign 用戶端逾時時間
ribbon:
  #指的是建立連接配接所用的時間,适用于網絡狀況正常的情況下,兩端連接配接所用的時間
  ReadTimeout: 5000
  #指的是建立連接配接後從伺服器讀取到可用資源所用的時間
  ConnectTimeout: 5000
           

  • Feign 提供了日志列印功能,可以通過配置來調整日志級别,進而了解 Feign 中 Http 請求的細節;
  • 也即:對 Feign 接口的調用情況進行監控和輸出;
級别 說明
NONE 預設的,不顯示任何日志
BASIC 僅記錄請求方法、URL、響應狀态碼及執行時間
HEADERS 除了 BASIC 中定義的資訊之外,還有請求和響應的頭資訊
FULL 除了 HEADERS 中定義的資訊之外,還有請求和響應的正文及中繼資料

在 config 包下;
@Configuration
public class FeignConfig{
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}
           

logging:
  level:
    #feign日志以什麼級别監控哪個接口
    com.xxx.springcloud.service.ProviderFeignService: debug
           

微服務架構 | 4.2 基于 Feign 與 OpenFeign 的服務接口調用

新人制作,如有錯誤,歡迎指出,感激不盡!

歡迎關注公衆号,會分享一些更日常的東西!

如需轉載,請标注出處!

微服務架構 | 4.2 基于 Feign 與 OpenFeign 的服務接口調用

繼續閱讀