公司项目进行微服务改造,由之前的达博改用SpringCloud,微服务之间通过FeignClient进行调用,今天在测试的时候,尤里卡注册中心有相应的服务,但FeignClient就是无法调通,一直报404错误,排查过程如下:
服务提供方定义的接口如下:
/* * *黑白名单查询接口 * * @author LiJunJun * @since 2018/10/18 */@ component (value=" https://www.yisu.com/zixun/blackAndWhiteListFeignClient ") @FeignClient(值=" https://www.yisu.com/zixun/pear-cache-service ",路径=皏1/缓存/limitlist”) 公共接口IBlackAndWhiteListFeignClient {/* * *获取黑白名单手机号分组编的号 * * @param跟踪请求流的水 * @param phoneNum电话号码 * @return电话号码所在分组 */@RequestMapping (value=" https://www.yisu.com/blackAndWhiteList "=RequestMethod方法。帖子,产生=MediaType.APPLICATION_JSON_UTF8_VALUE) ResultDatablackAndWhiteList (@RequestHeader (name="跟踪")字符串跟踪,@RequestParam (phoneNum)字符串phoneNum); }
接口实现类如下:
/* * *黑白名单控制器 * * @author LiJunJun * @since 2018/10/18 */@ProtectedLdApi @RestController @RequestMapping (value=" https://www.yisu.com/zixun/v1/cache/limitlist ") @Api(值=" https://www.yisu.com/zixun/黑白名单缓存”,描述=昂诎酌セ捍嫦喙亟涌凇? 公共类BlacklAndWhiteListController AbstractController延伸实现IBlackAndWhiteListFeignClient {/* * *日志记录器 */私人最终静态日志记录器=new日志(BlacklAndWhiteListController.class);/* * *注入tedis */@ autowired 私人JedisSentinelPoolExt jedisSentinelPool;/* * *获取黑白名单手机号分组编的号 * * @param跟踪请求流的水 * @param phoneNum电话号码 * @return电话号码所在分组 */@Override @ApiOperation(值=" https://www.yisu.com/zixun/获取黑白名单手机号分组编号”,指出=案莸缁昂怕氪踊捍嬷谢袢『诎酌シ肿椤? @RequestMapping (value=" https://www.yisu.com/blackAndWhiteList "=RequestMethod方法。帖子,消耗=MediaType。APPLICATION_JSON_UTF8_VALUE、生产=MediaType.APPLICATION_JSON_UTF8_VALUE) 公共ResultDatablackAndWhiteList (@RequestHeader (name="跟踪")字符串跟踪,@RequestParam (phoneNum)字符串phoneNum) { 做一些…… } }
调用方如下:
公开课MessageListController { 私有静态最终日志记录器=new日志(MessageListController.class); @ autowired 私人IBlackAndWhiteListFeignClient blackAndWhiteListFeignClient; @RequestMapping (value=" https://www.yisu.com/testBlackAndWhiteList "=RequestMethod方法。帖子,产生=MediaType.APPLICATION_JSON_UTF8_VALUE) 公共ResultDatatestBlackAndWhiteList () { LOGGER.info(“开始调用缓存接口”); ResultData res=blackAndWhiteListFeignClient。blackAndWhiteList (“asdqwezxxc”、“B18037903086”); LOGGER.info(“调用结果:“+ res.getResultData ()); 返回res; }
调用结果:
,华丽丽的404了,很头疼,经过各种度娘,发现导致这个问题有两个原因,以下是解决方法:
经过百度,说将SpringBoot配置文件里面<代码> server.servlet。上下文路径代码>注释掉即可,抱着试一哈的态度,注释了,重启,调用,结果惊喜的发现,依旧报错了,但仔细一看,错误代码已经不是404年,变成了415,这就相当于调通了,但是,内容类型的类型不对,于是,返回去看代码(此时已经肯定,今天能把feignclient接口调通),
仔细一看发现,接口上定义的@RequestMapping中,只定义了<代码>=MediaType产生。APPLICATION_JSON_UTF8_VALUE> 代码,而实现类中,@RequestMapping定义了消耗,生产均为<代码>“application/json; charset=utf - 8”代码>
我们知道,消耗定义了方法接受的Http的请求类型,生产则定义了Http请求返回的类型;
然后我们说下FeignClient,它的底层实现,就是根据定义的FeignClient接口,来组装Http请求进行远程调用,而Http默认的内容类型是x-www-form-urlencoded类型化的,到这儿,问题就呼之欲出了:
再来回顾上面我们定义的接口,并没有指定请求类型(消耗),那么FeignClient组装的Http请求的类型就是默认的x-www-form-urlencoded类型,但我们的实现类上,却定义了