春云踩坑记录之使用feignclient远程调用服务404的方法

  

  

公司项目进行微服务改造,由之前的达博改用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(“开始调用缓存接口”);      ResultDatares=blackAndWhiteListFeignClient。blackAndWhiteList (“asdqwezxxc”、“B18037903086”);      LOGGER.info(“调用结果:“+ res.getResultData ());      返回res;   }      

调用结果:

  

按涸撇瓤蛹锹贾褂胒eignclient远程调用服务404的方法"

  

,华丽丽的404了,很头疼,经过各种度娘,发现导致这个问题有两个原因,以下是解决方法:

  

  

经过百度,说将SpringBoot配置文件里面<代码> server.servlet。上下文路径注释掉即可,抱着试一哈的态度,注释了,重启,调用,结果惊喜的发现,依旧报错了,但仔细一看,错误代码已经不是404年,变成了415,这就相当于调通了,但是,内容类型的类型不对,于是,返回去看代码(此时已经肯定,今天能把feignclient接口调通),

  

仔细一看发现,接口上定义的@RequestMapping中,只定义了<代码>=MediaType产生。APPLICATION_JSON_UTF8_VALUE> “application/json; charset=utf - 8”

  

我们知道,消耗定义了方法接受的Http的请求类型,生产则定义了Http请求返回的类型;

  

然后我们说下FeignClient,它的底层实现,就是根据定义的FeignClient接口,来组装Http请求进行远程调用,而Http默认的内容类型是x-www-form-urlencoded类型化的,到这儿,问题就呼之欲出了:

  

再来回顾上面我们定义的接口,并没有指定请求类型(消耗),那么FeignClient组装的Http请求的类型就是默认的x-www-form-urlencoded类型,但我们的实现类上,却定义了

春云踩坑记录之使用feignclient远程调用服务404的方法