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。
推薦閱讀:
- Spring Cloud OpenFeign 遠程調用
- Spring Cloud-Feign服務調用的問題及處理方法
- Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例
- 基於spring cloud多個消費端重復定義feign client的問題
- 剖析SpringCloud Feign中所隱藏的坑