不少人可能对于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这篇帖子将会不断更新....