SpringCloud使用feign調(diào)用錯誤的問題
SpringCloud使用feign調(diào)用錯誤
首先啟動類上掃描接口:
@EnableFeignClients(value = {"com.xxx.*.xxx.controller"})
不然編譯器會報紅色波浪線
Method has too many Body parameters 可能原因
方法內(nèi)參數(shù)不止一個
1、如果是例如:
可以使用@RequestParam注解:
2、使用對象:
解決辦法有兩個:
1、使用注解@SpringQueryMap
2、把這兩個對象整合為一個,例如把User中相關(guān)屬性寫到PageRequest中,保證只有一個對象。
Method metrics not annotated with HTTP method type (ex. GET, POST)
可能原因:接口處有方法沒有添加和@GetMapping功能類似的注解,即便具體業(yè)務(wù)沒有做,也要加上,否則導(dǎo)入的服務(wù)無法啟動。
調(diào)用接口得到了莫名其妙的結(jié)果
可能原因:由于現(xiàn)在大多數(shù)采用resultful風(fēng)格接口,而默認(rèn)的feign使用GET請求調(diào)用接口,目標(biāo)接口是使用對象接收時,會轉(zhuǎn)為POST請求,你會看到日志里接口由GET自動變?yōu)榱薖OST。
解決辦法:
1、改為POST請求,如果接口是別人提供的就無法使用,因為可能別人服務(wù)已經(jīng)聯(lián)調(diào)好了,再去改很麻煩,加上別人很忙,可能也不會回頭來給你改。
2、目標(biāo)接口參數(shù)加上@SpringQueryMap,不過有可能像我在協(xié)同開發(fā)的時候,服務(wù)是別人的,無法改變別人的服務(wù),那么只能換其它方式了。
3、本服務(wù)加上這兩個依賴
<!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.9</version> </dependency> <!-- feign-httpclient --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> <version>10.2.3</version> </dependency>
4、像我們項目,本來我使用第3種方法解決,可能我們組長說我為什么導(dǎo)入這兩個依賴,我解釋之后,他新寫了一個POST接口用于調(diào)用,所以最后究竟選擇什么辦法,還是看你們組長決定,哈哈。
5、再說一下,其實你自己無法改變別人的接口參數(shù),你可以寫一個一樣的,只要請求地址正確,完全可以使用,例如他死活不愿意加注解,你可以在自己的新建的接口加上任意注解參數(shù),也是可以使用的,但是極其不推薦,弊端很多,但是可以用于測試,最后還是去溝通一下,找組長。再說一遍:別這么干。
SpringCloud之Feign調(diào)用400錯誤問題
項目在本地環(huán)境一直在正常運(yùn)行,突然測試環(huán)境大量報錯,點哪錯哪.
項目報錯的接口是 A服務(wù)通過feign調(diào)用B服務(wù),但是會通過兩個接口調(diào)用兩次B服務(wù)
查看測試環(huán)境日志發(fā)現(xiàn)錯誤如下:
這里只展示主要異常信息
feign.FeignException: status 400 reading
一開始我們被這個400的錯誤碼誤導(dǎo)了,一直查參數(shù)問題,但是換了所有參數(shù)后,還是報這個錯,總之網(wǎng)上的解決辦法能找的都找了.什么參數(shù)不對,序列化不對,參數(shù)過大,返回值過大,豪豬超時.甚至是服務(wù)器重啟都試過,還是沒能解決問題
最后的最后,直接上干貨,如果上述方法你都試過,但是還是沒能解決的話,那么你可能是跟我一樣的問題.
直接貼干貨代碼:
@RequestMapping(value ="/api/getBeingProject",headers = {"Connection=close"}) List<SysProject> getBeingProject(@RequestParam String entId);
上述是自定義client中的一個遠(yuǎn)程方法,在方法上加入關(guān)鍵的
headers = {"Connection=close"}
這代表這次調(diào)用后,會立馬關(guān)閉回收連接.
結(jié)論:
通過公司幾位大佬各種跟源碼分析,情況可能是這樣的,
兩次調(diào)用都會從連接池去拿連接
有可能是第一次調(diào)用的連接需要2秒鐘
但是1秒就執(zhí)行完畢了,然后第二次連接就過來了
直接拿了第一次剩下的連接去用
然后就直接把本次連接拒絕掉
feign就會報400錯誤,在方法上加這個headers后
本次調(diào)用后,會立馬回收關(guān)閉連接,不給其他人拿到這次連接的機(jī)會,就解決了問題
彩蛋:
所有環(huán)境都沒問題后,發(fā)布線上,發(fā)現(xiàn)線上還是會有一個接口還出現(xiàn)同樣的問題.最后發(fā)現(xiàn)是這個接口請求的數(shù)據(jù)有點大,然后分批次去請求就解決了問題。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- SpringCloud實現(xiàn)服務(wù)調(diào)用feign與熔斷hystrix和網(wǎng)關(guān)gateway詳細(xì)分析
- SpringCloud服務(wù)接口調(diào)用OpenFeign及使用詳解
- SpringCloud使用Feign實現(xiàn)遠(yuǎn)程調(diào)用流程詳細(xì)介紹
- SpringCloud?openfeign聲明式服務(wù)調(diào)用實現(xiàn)方法介紹
- SpringCloud openfeign相互調(diào)用實現(xiàn)方法介紹
- SpringCloud Feign遠(yuǎn)程調(diào)用與自定義配置詳解
相關(guān)文章
Java基于線程實現(xiàn)帶有滾動效果的Label標(biāo)簽實例
這篇文章主要介紹了Java基于線程實現(xiàn)帶有滾動效果的Label標(biāo)簽,實例分析了java線程的使用技巧及l(fā)abel標(biāo)簽的實現(xiàn)方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07SpringBoot集成thymeleaf瀏覽器404的解決方案
前后端不分離的古早 SpringMVC 項目通常會使用 thymeleaf 模板引擎來完成 html 頁面與后端接口之間的交互,如果要將項目架構(gòu)升級成 SpringBoot , thymeleaf 也可以照常集成,但有時候會踩到一些坑,所以本文給大家介紹了SpringBoot集成thymeleaf瀏覽器404的解決方案2024-12-12Spring超詳細(xì)講解事務(wù)和事務(wù)傳播機(jī)制
Spring事務(wù)的本質(zhì)就是對數(shù)據(jù)庫事務(wù)的支持,沒有數(shù)據(jù)庫事務(wù),Spring是無法提供事務(wù)功能的。Spring只提供統(tǒng)一的事務(wù)管理接口,具體實現(xiàn)都是由數(shù)據(jù)庫自己實現(xiàn)的,Spring會在事務(wù)開始時,根據(jù)當(dāng)前設(shè)置的隔離級別,調(diào)整數(shù)據(jù)庫的隔離級別,由此保持一致2022-06-06在controller中如何設(shè)置接收參數(shù)的默認(rèn)值
這篇文章主要介紹了在controller中如何設(shè)置接收參數(shù)的默認(rèn)值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03