feign?打印日志不顯示的問(wèn)題及解決
feign打印日志不顯示
1.是否有設(shè)置 feign 的 Logger.Level
@Configuration public class FeignClientConfig { ?? ?@Bean ?? ?Logger.Level feignLogLevel() { ?? ??? ?return Logger.Level.FULL; ?? ?} }
2.查看是否有在 yml 或者 properties 文件中有設(shè)置 level
logging: ? level: ? ? cn.itcast.order: debug
3.如果上面兩項(xiàng)設(shè)置后還沒(méi)有正確日志輸出,那么請(qǐng)確定你是否開(kāi)啟了 log4j ,如果使用了,請(qǐng)?jiān)?logback.xml 文件中檢查是否添加了一下內(nèi)容
<!-- 這里是你得 feign 包--> <logger name="com.business.gateway.iao" level="DEBUG" additivity="false"> ?? ?<appender-ref ref="STDOUT"/> </logger>
如果還沒(méi)有效果,那么恭喜你,中獎(jiǎng)了,只能通過(guò) log4j 底層源碼去 debug 了。一般前3步做完 日志都會(huì)正確出現(xiàn),最后請(qǐng)大家一定要去看官方文檔。
feign基本使用
在開(kāi)發(fā) Spring Cloud 微服務(wù)的時(shí)候,我們知道,服務(wù)之間都是以 HTTP 接口的形式對(duì)外提供服務(wù)的,因此消費(fèi)者在進(jìn)行調(diào)用的時(shí)候,底層就是通過(guò) HTTP Client 的這種方式進(jìn)行訪問(wèn)。
當(dāng)然我們可以使用JDK原生的 URLConnection、Apache 的 HTTP Client、Netty 異步 Http Client,Spring 的 RestTemplate 去實(shí)現(xiàn)服務(wù)間的調(diào)用。
但是最方便、最優(yōu)雅的方式是通過(guò) Spring Cloud Open Feign 進(jìn)行服務(wù)間的調(diào)用 Spring Cloud 對(duì) Feign 進(jìn)行了增強(qiáng),使 Feign 支持 Spring Mvc 的注解,并整合了 Ribbon 等,從而讓 Feign 的使用更加方便。
Feign 概述
什么是 Feign
Feign 是一個(gè)聲明式的 Web Service 客戶端。它的出現(xiàn)使開(kāi)發(fā) Web Service 客戶端變得很簡(jiǎn)單。使用 Feign 只需要?jiǎng)?chuàng)建一個(gè)接口加上對(duì)應(yīng)的注解,比如:@FeignClient 注解。 Feign 有可插拔的注解,包括 Feign 注解和 AX-RS 注解。Feign 也支持編碼器和解碼器,Spring Cloud Open Feign 對(duì) Feign 進(jìn)行增強(qiáng)支持 Spring Mvc 注解,可以像 Spring Web 一樣使用 HttpMessageConverters 等。
Feign 是一種聲明式、模板化的 HTTP 客戶端。在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 請(qǐng)求訪問(wèn)遠(yuǎn)程服務(wù),就像調(diào)用本地方法一樣的,開(kāi)發(fā)者完全感知不到這是在調(diào)用遠(yuǎn)程方法,更感知不到在訪問(wèn) HTTP 請(qǐng)求。接下來(lái)介紹一下 Feign 的特性,具體如下:
- 可插拔的注解支持,包括 Feign 注解和AX-RS注解。
- 支持可插拔的 HTTP 編碼器和解碼器。
- 支持 Hystrix 和它的 Fallback。
- 支持 Ribbon 的負(fù)載均衡。
- 支持 HTTP 請(qǐng)求和響應(yīng)的壓縮。Feign 是一個(gè)聲明式的 WebService 客戶端,它的目的就是讓 Web Service 調(diào)用更加簡(jiǎn)單。它整合了 Ribbon 和 Hystrix,從而不需要開(kāi)發(fā)者針對(duì) Feign 對(duì)其進(jìn)行整合。Feign 還提供了 HTTP 請(qǐng)求的模板,通過(guò)編寫簡(jiǎn)單的接口和注解,就可以定義好 HTTP 請(qǐng)求的參數(shù)、格式、地址等信息。Feign 會(huì)完全代理 HTTP 的請(qǐng)求,在使用過(guò)程中我們只需要依賴注入 Bean,然后調(diào)用對(duì)應(yīng)的方法傳遞參數(shù)即可。
Feign 入門案例
此處以調(diào)用 Github API 查詢服務(wù)為例。
引入依賴
<dependency> ? ? <groupId>org.springframework.cloud</groupId> ? ? <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
啟動(dòng)類加入如下注解:
/** 開(kāi)啟 Feign 掃描支持 */ @EnableFeignClients?
Feign 接口編寫
/** ?* @Author:大漠知秋 ?* @Description:使用 Feign 訪問(wèn) 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 訪問(wèn) 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); ? ? } }
結(jié)果
Feign 工作原理
在開(kāi)發(fā)微服務(wù)應(yīng)用時(shí),我們會(huì)在主程序入口添加 @EnableFeignClients 注解開(kāi)啟對(duì) Feign Client 掃描加載處理。根據(jù) Feign Client 的開(kāi)發(fā)規(guī)范,定義接口并加 @FeignClients 注解。
當(dāng)程序啟動(dòng)時(shí),會(huì)進(jìn)行包掃描,掃描所有 @FeignClients 的注解的類,并將這些信息注入 Spring IOC 容器中。當(dāng)定義的 Feign 接口中的方法被調(diào)用時(shí),通過(guò)JDK的代理的方式,來(lái)生成具體的 RequestTemplate。當(dāng)生成代理時(shí),F(xiàn)eign 會(huì)為每個(gè)接口方法創(chuàng)建一個(gè) RequetTemplate 對(duì)象,該對(duì)象封裝了 HTTP 請(qǐng)求需要的全部信息,如請(qǐng)求參數(shù)名、請(qǐng)求方法等信息都是在這個(gè)過(guò)程中確定的。
然后由 RequestTemplate 生成 Request,然后把 Request 交給 Client 去處理,這里指的 Client 可以是 JDK 原生的 URLConnection、Apache 的 Http Client 也可以是 Okhttp。最后 Client 被封裝到 LoadBalanceclient 類,這個(gè)類結(jié)合 Ribbon 負(fù)載均衡發(fā)起服務(wù)之間的調(diào)用。
@FeignClient 注解
name
:指定 Feign Client 的名稱,如果項(xiàng)目使用了 Ribbon,name 屬性會(huì)作為微服務(wù)的名稱,用于服務(wù)發(fā)現(xiàn)。url
:url 一般用于調(diào)試,可以手動(dòng)指定 @FeignClient 調(diào)用的地址。decode404
:當(dāng)發(fā)生404錯(cuò)誤時(shí),如果該字段為 true,會(huì)調(diào)用 decoder 進(jìn)行解碼,否則拋出 FeignException。configuration
:Feign 配置類,可以自定義 Feign 的 Encoder、Decoder、LogLevel、Contract。fallback
:定義容錯(cuò)的處理類,當(dāng)調(diào)用遠(yuǎn)程接口失敗或超時(shí)時(shí),會(huì)調(diào)用對(duì)應(yīng)接口的容錯(cuò)邏輯,fallback 指定的類必須實(shí)現(xiàn) @FeignClient 標(biāo)記的接口。fallbackFactory
:工廠類,用于生成 fallback 類示例,通過(guò)這個(gè)屬性我們可以實(shí)現(xiàn)每個(gè)接口通用的容錯(cuò)邏輯,減少重復(fù)的代碼。path
:定義當(dāng)前 FeignClient 的統(tǒng)一前綴。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java自定義動(dòng)態(tài)鏈接數(shù)據(jù)庫(kù)示例
這篇文章主要介紹了java自定義動(dòng)態(tài)鏈接數(shù)據(jù)庫(kù)示例,需要的朋友可以參考下2014-02-02Java數(shù)組常見(jiàn)應(yīng)用詳解【創(chuàng)建、遍歷、排序、查找】
這篇文章主要介紹了Java數(shù)組常見(jiàn)應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了java數(shù)組的基本定義、創(chuàng)建、遍歷、排序、查找等相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-02-02詳解Java線程池如何實(shí)現(xiàn)優(yōu)雅退出
這篇文章我們將從源碼角度深度解析線程池是如何優(yōu)雅的退出程序的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java線程池有一定幫助,需要的可以參考一下2022-07-07idea切換分支的時(shí)候,忽略一些無(wú)用的修改設(shè)置
這篇文章主要介紹了idea切換分支的時(shí)候,忽略一些無(wú)用的修改操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02springboot?html調(diào)用js無(wú)效400問(wèn)題及解決
這篇文章主要介紹了springboot?html調(diào)用js無(wú)效400的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03尋找二叉樹(shù)最遠(yuǎn)的葉子結(jié)點(diǎn)(實(shí)例講解)
下面小編就為大家分享一篇尋找二叉樹(shù)最遠(yuǎn)的葉子結(jié)點(diǎn)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12spring cloud consul注冊(cè)的服務(wù)報(bào)錯(cuò)critical的解決
這篇文章主要介紹了spring cloud consul注冊(cè)的服務(wù)報(bào)錯(cuò)critical的解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03SpringBoot中的FailureAnalyzer使用詳解
這篇文章主要介紹了SpringBoot中的FailureAnalyzer使用詳解,Spring Boot的FailureAnalyzer是一個(gè)接口,它用于在Spring Boot應(yīng)用啟動(dòng)失敗時(shí)提供有關(guān)錯(cuò)誤的詳細(xì)信息,這對(duì)于開(kāi)發(fā)者來(lái)說(shuō)非常有用,因?yàn)樗梢詭椭覀兛焖僮R(shí)別問(wèn)題并找到解決方案,需要的朋友可以參考下2023-12-12springboot2.2 集成 activity6實(shí)現(xiàn)請(qǐng)假流程(示例詳解)
這篇文章主要介紹了springboot2.2 集成 activity6實(shí)現(xiàn)請(qǐng)假完整流程示例詳解,本文通過(guò)示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Java中實(shí)現(xiàn)線程間通信的實(shí)例教程
線程通信的目標(biāo)是使線程間能夠互相發(fā)送信號(hào),另一方面線程通信使線程能夠等待其他線程的信號(hào),這篇文章主要給大家介紹了關(guān)于Java中實(shí)現(xiàn)線程間通信的相關(guān)資料,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09