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è)務沒有做,也要加上,否則導入的服務無法啟動。
調(diào)用接口得到了莫名其妙的結(jié)果
可能原因:由于現(xiàn)在大多數(shù)采用resultful風格接口,而默認的feign使用GET請求調(diào)用接口,目標接口是使用對象接收時,會轉(zhuǎn)為POST請求,你會看到日志里接口由GET自動變?yōu)榱薖OST。
解決辦法:
1、改為POST請求,如果接口是別人提供的就無法使用,因為可能別人服務已經(jīng)聯(lián)調(diào)好了,再去改很麻煩,加上別人很忙,可能也不會回頭來給你改。
2、目標接口參數(shù)加上@SpringQueryMap,不過有可能像我在協(xié)同開發(fā)的時候,服務是別人的,無法改變別人的服務,那么只能換其它方式了。
3、本服務加上這兩個依賴
<!-- 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種方法解決,可能我們組長說我為什么導入這兩個依賴,我解釋之后,他新寫了一個POST接口用于調(diào)用,所以最后究竟選擇什么辦法,還是看你們組長決定,哈哈。
5、再說一下,其實你自己無法改變別人的接口參數(shù),你可以寫一個一樣的,只要請求地址正確,完全可以使用,例如他死活不愿意加注解,你可以在自己的新建的接口加上任意注解參數(shù),也是可以使用的,但是極其不推薦,弊端很多,但是可以用于測試,最后還是去溝通一下,找組長。再說一遍:別這么干。
SpringCloud之Feign調(diào)用400錯誤問題
項目在本地環(huán)境一直在正常運行,突然測試環(huán)境大量報錯,點哪錯哪.
項目報錯的接口是 A服務通過feign調(diào)用B服務,但是會通過兩個接口調(diào)用兩次B服務
查看測試環(huán)境日志發(fā)現(xiàn)錯誤如下:
這里只展示主要異常信息
feign.FeignException: status 400 reading
一開始我們被這個400的錯誤碼誤導了,一直查參數(shù)問題,但是換了所有參數(shù)后,還是報這個錯,總之網(wǎng)上的解決辦法能找的都找了.什么參數(shù)不對,序列化不對,參數(shù)過大,返回值過大,豪豬超時.甚至是服務器重啟都試過,還是沒能解決問題
最后的最后,直接上干貨,如果上述方法你都試過,但是還是沒能解決的話,那么你可能是跟我一樣的問題.
直接貼干貨代碼:
@RequestMapping(value ="/api/getBeingProject",headers = {"Connection=close"}) List<SysProject> getBeingProject(@RequestParam String entId);
上述是自定義client中的一個遠程方法,在方法上加入關(guān)鍵的
headers = {"Connection=close"}
這代表這次調(diào)用后,會立馬關(guān)閉回收連接.
結(jié)論:
通過公司幾位大佬各種跟源碼分析,情況可能是這樣的,
兩次調(diào)用都會從連接池去拿連接
有可能是第一次調(diào)用的連接需要2秒鐘
但是1秒就執(zhí)行完畢了,然后第二次連接就過來了
直接拿了第一次剩下的連接去用
然后就直接把本次連接拒絕掉
feign就會報400錯誤,在方法上加這個headers后
本次調(diào)用后,會立馬回收關(guān)閉連接,不給其他人拿到這次連接的機會,就解決了問題
彩蛋:
所有環(huán)境都沒問題后,發(fā)布線上,發(fā)現(xiàn)線上還是會有一個接口還出現(xiàn)同樣的問題.最后發(fā)現(xiàn)是這個接口請求的數(shù)據(jù)有點大,然后分批次去請求就解決了問題。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java基于線程實現(xiàn)帶有滾動效果的Label標簽實例
這篇文章主要介紹了Java基于線程實現(xiàn)帶有滾動效果的Label標簽,實例分析了java線程的使用技巧及l(fā)abel標簽的實現(xiàn)方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07SpringBoot集成thymeleaf瀏覽器404的解決方案
前后端不分離的古早 SpringMVC 項目通常會使用 thymeleaf 模板引擎來完成 html 頁面與后端接口之間的交互,如果要將項目架構(gòu)升級成 SpringBoot , thymeleaf 也可以照常集成,但有時候會踩到一些坑,所以本文給大家介紹了SpringBoot集成thymeleaf瀏覽器404的解決方案2024-12-12