feign 打印日志不顯示的問題及解決

feign打印日志不顯示

1.是否有設置 feign 的 Logger.Level

@Configuration
public class FeignClientConfig {
    @Bean
    Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }
}

2.查看是否有在 yml 或者 properties 文件中有設置 level

logging:
  level:
    cn.itcast.order: debug

3.如果上面兩項設置後還沒有正確日志輸出,那麼請確定你是否開啟瞭 log4j ,如果使用瞭,請在 logback.xml 文件中檢查是否添加瞭一下內容

<!-- 這裡是你得 feign 包-->
<logger name="com.business.gateway.iao" level="DEBUG" additivity="false">
    <appender-ref ref="STDOUT"/>
</logger>

如果還沒有效果,那麼恭喜你,中獎瞭,隻能通過 log4j 底層源碼去 debug 瞭。一般前3步做完 日志都會正確出現,最後請大傢一定要去看官方文檔。

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 等,從而讓 Feign 的使用更加方便。

Feign 概述

什麼是 Feign

Feign 是一個聲明式的 Web Service 客戶端。它的出現使開發 Web Service 客戶端變得很簡單。使用 Feign 隻需要創建一個接口加上對應的註解,比如:@FeignClient 註解。 Feign 有可插拔的註解,包括 Feign 註解和 AX-RS 註解。Feign 也支持編碼器和解碼器,Spring Cloud Open Feign 對 Feign 進行增強支持 Spring Mvc 註解,可以像 Spring Web 一樣使用 HttpMessageConverters 等。

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 入門案例

此處以調用 Github API 查詢服務為例。

引入依賴

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

啟動類加入如下註解:

/** 開啟 Feign 掃描支持 */
@EnableFeignClients 

Feign 接口編寫

/**
 * @Author:大漠知秋
 * @Description:使用 Feign 訪問 Github 查詢 API
 * @CreateDate:2:36 PM 2018/10/24
 */
@FeignClient(name = "github-client", url = "https://api.github.com")
public interface GitHubFeign {

    @RequestMapping(
            value = "/search/repositories",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_UTF8_VALUE
    )
    String searchRepo(@RequestParam("q") String q);
}

Controller

/**
 * @Author:大漠知秋
 * @Description:使用 Feign 訪問 Github 查詢 API
 * @CreateDate:2:42 PM 2018/10/24
 */
@RestController
@RequestMapping(
        value = "/github",
        produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
public class GitHubController {

    @Resource
    private GitHubFeign gitHubFeign;

    @RequestMapping(
            value = "/search/repositories",
            method = RequestMethod.GET
    )
    String searchRepo(@RequestParam("q") String q) {
        return gitHubFeign.searchRepo(q);
    }
}

結果

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 的統一前綴。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: