微服務(wù)框架FEIGN使用常見問題分析
1.寫在前面
很多時候,我們在使用微服務(wù)框架的時候,就基本上少不了與feign打交道。
畢竟服務(wù)之間的調(diào)用,基本上都不會用http調(diào)了,這樣顯得有點(diǎn)麻煩了,feign更方便了。
而且feign,還自帶了負(fù)載均衡的策略(ribbon提供),如果我們的服務(wù)是集群的,feign還能負(fù)載調(diào)用。
這些估計大家都懂吧?不會還有人不懂吧?那這個要深入學(xué)習(xí)了。哈哈
在用feign的日常中,難免會遇到些問題,那下面,我來總結(jié)下,我在項(xiàng)目開發(fā)中遇到的問題嘍。
哈哈,雖說不是大問題,但至少是點(diǎn)經(jīng)驗(yàn)分享嘍,希望可以幫助到大家。
好啦,下面開始嘍?。?!
2. FEIGN 常見問題
2.1 400 Bad Request 問題
2.1.1 問題描述
在使用feign調(diào)用的使用出現(xiàn)400 Bad request的問題。
2.1.2 代碼如下
@PostMapping("/llsydn/getMenusByIdsAndTypes") List<SysMenuDto> getMenusByIdsAndTypes(@RequestParam("menuIds") String menuIds, @RequestParam("menuType") String menuType);
這個 menuIds 數(shù)量比較多,導(dǎo)致400 錯誤。發(fā)現(xiàn)問題出在menuIds 跟在URL后面。
2.1.3 解決辦法
將方法修改為:
@PostMapping("/llsydn/getMenusByIdsAndTypes") List<SysMenuDto> getMenusByIdsAndTypes(@RequestBody MultiValueMap<String,String> queryParam);
調(diào)用方法修改成:
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)調(diào)用系統(tǒng)腳本的接口的時候拋出如下的錯誤。
Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens
2.2.2 錯誤原因
是feign 調(diào)用的時候啟用了壓縮導(dǎo)致的。
3.2.3 解決辦法
- 1.關(guān)閉壓縮即可。
將配置改成:
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調(diào)用時,傳到目標(biāo)服務(wù)的方法中,字符串里的中文變成問號了
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調(diào)用超時,會出現(xiàn)這個問題。
一般來說當(dāng)我們的業(yè)務(wù)需要處理的時間很大時,會出現(xiàn)這個問題。例如,上傳excel文件。
那這里我們可以進(jìn)行feign的超時時間設(shè)置。這里只針對指定的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: #默認(rèn)時間設(shè)置為10s ConnectTimeOut: 10000 ReadTimeOut: 10000 #調(diào)用system微服務(wù),默認(rèn)時間設(shè)置為30s systemClient: ConnectTimeOut: 30000 ReadTimeOut: 30000
以上就是微服務(wù)框架FEIGN常見問題分析的詳細(xì)內(nèi)容,更多關(guān)于微服務(wù)框架FEIGN問題的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡單談?wù)凧ava中String類型的參數(shù)傳遞問題
這篇文章主要介紹了簡單談?wù)凧ava中String類型的參數(shù)傳遞問題的相關(guān)資料,需要的朋友可以參考下2015-12-12Spring中ClassPathXmlApplicationContext類的使用詳解
這篇文章主要介紹了Spring中ClassPathXmlApplicationContext類的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01詳解Java實(shí)現(xiàn)的k-means聚類算法
這篇文章主要介紹了詳解Java實(shí)現(xiàn)的k-means聚類算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例
這篇文章主要介紹了java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12