微服務框架FEIGN使用常見問題分析
1.寫在前面
很多時候,我們在使用微服務框架的時候,就基本上少不了與feign打交道。
畢竟服務之間的調用,基本上都不會用http調了,這樣顯得有點麻煩了,feign更方便了。
而且feign,還自帶了負載均衡的策略(ribbon提供),如果我們的服務是集群的,feign還能負載調用。
這些估計大家都懂吧?不會還有人不懂吧?那這個要深入學習了。哈哈
在用feign的日常中,難免會遇到些問題,那下面,我來總結下,我在項目開發(fā)中遇到的問題嘍。
哈哈,雖說不是大問題,但至少是點經(jīng)驗分享嘍,希望可以幫助到大家。
好啦,下面開始嘍!??!
2. FEIGN 常見問題
2.1 400 Bad Request 問題
2.1.1 問題描述
在使用feign調用的使用出現(xiàn)400 Bad request的問題。
2.1.2 代碼如下
@PostMapping("/llsydn/getMenusByIdsAndTypes")
List<SysMenuDto> getMenusByIdsAndTypes(@RequestParam("menuIds") String menuIds,
@RequestParam("menuType") String menuType);
這個 menuIds 數(shù)量比較多,導致400 錯誤。發(fā)現(xiàn)問題出在menuIds 跟在URL后面。
2.1.3 解決辦法
將方法修改為:
@PostMapping("/llsydn/getMenusByIdsAndTypes")
List<SysMenuDto> getMenusByIdsAndTypes(@RequestBody MultiValueMap<String,String> queryParam);
調用方法修改成:
public List<SysMenuDto> getMenusByIdsAndNotType(String menuIds, String menuType){
MultiValueMap valueMap=new LinkedMultiValueMap();
valueMap.add("menuIds",menuIds);
valueMap.add("menuType",menuType);
return systemClient.getMenusByIdsAndTypes(valueMap);
}
2.2. 非法字符錯誤
2.2.1 錯誤信息
在系統(tǒng)調用系統(tǒng)腳本的接口的時候拋出如下的錯誤。
Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens
2.2.2 錯誤原因
是feign 調用的時候啟用了壓縮導致的。
3.2.3 解決辦法
- 1.關閉壓縮即可。

將配置改成:
feign.compression.request.enabled=false feign.compression.response.enabled=false
- 2.或者使用okHttp
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
2.3. 字符串中文亂碼問題
2.3.1 錯誤信息
在Feign調用時,傳到目標服務的方法中,字符串里的中文變成問號了
2.3.2 解決辦法
在Feign的接口的注解中指定consumes字符集:
@PostMapping(value = "/portal/core/appdata/install",consumes = "application/json;charset=UTF-8") void install(@RequestBody String data);
如果此時data為[{},{}]格式的JSON字符串,即JSON數(shù)組字符串,又會報參數(shù)類型不匹配的錯誤,要把參數(shù)改為對象數(shù)組或者List對象:
@PostMapping(value = "/portal/core/appdata/install",consumes = "application/json;charset=UTF-8") void install(@RequestBody Object[] data);
2.4. too many Body parameters問題
2.4.1 問題描述
feign的post請求只能有一個body feign的post方法中,只能使用一個@RequestBody或者不帶該注解,不能使用多個@RequestBody。
否則會報錯nested exception is java.lang.IllegalStateException: Method has too many Body parameters。
2.4.2 解決辦法
只保留一個@RequestBody注解
2.5. Read timed out問題
2.5.1 問題描述
feign調用超時,會出現(xiàn)這個問題。
一般來說當我們的業(yè)務需要處理的時間很大時,會出現(xiàn)這個問題。例如,上傳excel文件。
那這里我們可以進行feign的超時時間設置。這里只針對指定的feign client
2.5.2 解決辦法
@FeignClient(name = "systemClient")
public interface SystemClient {
@RequestMapping(path = "/llsydn/importExcel", consumes = {"multipart/form-data"})
JsonResult importExcel(@RequestPart(name="file") MultipartFile file);
}
- yml配置
feign:
httpclient:
enabled: true
client:
config:
default:
#默認時間設置為10s
ConnectTimeOut: 10000
ReadTimeOut: 10000
#調用system微服務,默認時間設置為30s
systemClient:
ConnectTimeOut: 30000
ReadTimeOut: 30000以上就是微服務框架FEIGN常見問題分析的詳細內容,更多關于微服務框架FEIGN問題的資料請關注腳本之家其它相關文章!
相關文章
Mockito mock Kotlin Object類方法報錯解決方法
這篇文章主要介紹了Mockito mock Kotlin Object類方法報錯解決方法,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-09-09
從Android源碼剖析Intent查詢匹配的實現(xiàn)
這篇文章主要介紹了從Android源碼剖析Intent查詢匹配的實現(xiàn),Intent部分的源碼為Java代碼,需要的朋友可以參考下2015-07-07
從0到1學SpringCloud之SpringCloud?gateway網(wǎng)關路由配置示例詳解
Spring?Cloud?Gateway的目標提供統(tǒng)一的路由方式且基于Filter?鏈的方式提供了網(wǎng)關基本的功能,?例如:安全、監(jiān)控、指標和限流?,這篇文章主要介紹了從0到1學SpringCloud之SpringCloud?gateway網(wǎng)關路由配置示例詳解,需要的朋友可以參考下2023-04-04
Java使用JCommander實現(xiàn)解析命令行參數(shù)
jcommander?是一個只有幾十?kb?的?Java?命令行參數(shù)解析工具,可以通過注解的方式快速實現(xiàn)命令行參數(shù)解析,本文就來和大家介紹一下JCommander是如何解析命令行參數(shù)吧2023-06-06
Java實戰(zhàn)之在線租房系統(tǒng)的實現(xiàn)
這篇文章主要介紹了利用Java實現(xiàn)的在線租房系統(tǒng),文中用到了SpringBoot、Redis、MySQL、Vue等技術,文中示例代碼講解詳細,需要的可以參考一下2022-02-02
Java方法調用解析靜態(tài)分派動態(tài)分派執(zhí)行過程
這篇文章主要為大家介紹了Java方法調用解析靜態(tài)分派動態(tài)分派執(zhí)行過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

