不少人可能對於feign 不是很熟悉,能夠看一下其餘網友的實例分享:spring cloud feign簡介java
若是以爲上面這個比較難的話,還有一個簡單入門的:spring cploud feign使用詳解程序員
今天的主題是記錄遇到的坑,關於feign的資料網友分享已經很詳細,我就不班門弄斧啦啦web
此次在作一箇中臺項目(使用 spring boot),須要和市場上不少同行公司結合的那種,這就涉及到同個服務須要被不少外部服務調用的場景,以前一般都會用代理去實現對其餘外部服務的訪問,但代理模塊也須要寫不少代碼,對於懶惰的程序員而言,這固然是要想辦法簡化的(是誰說的,不會偷懶的程序員都不是好程序員來着?)spring
而後有大神推薦咱們使用了feign,Feign 是 Spring Cloud的組件,這裏就須要討論spring boot 和spring cloud 整合的問題了,可是不展開,能夠移步擴展閱讀。json
在依賴了 spring cloud以後,外部服務就能夠愉快的開始使用 feign來調用咱們的接口了api
@FeignClient(name = "${test-service.application.name}", configuration = TestServiceFeignConfig.class) public interface TestServiceInterfaceClient extends TestServiceInterfaceApi{ }
TestServiceInterfaceApi 是咱們中臺內部實現的接口,接口定義以下:
/** * 版權全部(C),xxxx公司,2019,全部權利保留。 * * 項目名: test-client-api * 文件名: TestServiceApi.java * 模塊說明: * 修改歷史: * 2019年6月20日 -ln- 建立。 */ package com.xxxx.test.client.api.test; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.*; import java.util.List; /** * xxxxx服務 * * @author ln * */ @Api(tags = "xxxxx服務") @RequestMapping(value = "service/test", produces = "application/json;charset=utf-8") public interface TestServiceInterfaceApi { /** * 查詢 * * @param id1 * id1 * @param filter * 查詢條件 * @return 查詢結果 */ @ApiOperation(value = "查詢") @RequestMapping(value = "/query", method = RequestMethod.POST) @ResponseBody Response<List<TestEntity>> query( // @ApiParam(required = true) @PathVariable("id1") String id1, @ApiParam(required = true) @RequestBody TestFilter filter); /** * 批量移除 * * @param id1 * id1 * @param modifition * 處理內容 * @return 處理結果 */ @ApiOperation(value = " 批量移除") @RequestMapping(value = "/batchremove", method = RequestMethod.POST) @ResponseBody Response batchRemove( // @ApiParam(required = true) @PathVariable("id1") String id1, @ApiParam(required = true) @RequestBody TestBatchRemove batchRemove, @ApiParam(required = true) @RequestParam String operator); }
這時候,在外部系統服務裏 @Autowired 一下 TestServiceInterfaceClient 就能夠調用到咱們的接口了,按道理講這個流程應該順暢無比,畢竟定義 feignClient 才這麼幾行代碼,不可能出錯,but 程序員不多是不寫bug 的~~app
外部服務啓動時,報錯:異步
這個報錯是說咱們中臺服務的某個接口的第2 個參數爲空,可是咱們本地的服務是正常啓用的,內部調用無比順暢,那,問題在哪?ui
通過排查,發現是咱們接口定義用到了 @RequestParam 註解,可是Feign 對 @RequestParam 聲明的參數未識別到,加上參數的名字以後,一切OKspa
/** * 批量移除 * * @param id1 * id1 * @param modifition * 處理內容 * @return 處理結果 */ @ApiOperation(value = " 批量移除") @RequestMapping(value = "/batchremove", method = RequestMethod.POST) @ResponseBody Response batchRemove( // @ApiParam(required = true) @PathVariable("id1") String id1, @ApiParam(required = true) @RequestBody TestBatchRemove batchRemove, @ApiParam(required = true) @RequestParam("operator") String operator); }
後面找了找,發現前面也有不少人遇到了類似的問題,還有網友系統的整理了坑,具體可異步擴展閱讀。
雖然這是一個很小的點,小菜依舊很開心(畢竟不用背鍋啊)。
咱們的中臺功能在不斷地發展全面,so這篇帖子將會不斷更新....