其他分享
首页 > 其他分享> > 为什么不能在FeignClient接口上添加@RequestMapping 注解?

为什么不能在FeignClient接口上添加@RequestMapping 注解?

作者:互联网

  最近发现许多同学在开发协议包时, 会在 FeignClient 接口上添加 RequestMapping 注解来设置统一接口前缀, 如下:  

这么做会产生哪些问题呢?

  1. 与消费方服务原有接口产生冲突

我们设想一个最常见的场景, 服务A实现并提供协议包, 服务B在项目中引入了该协议包 假设协议包中有这么一个RPC接口: 服务B中存在这么一个聚合接口: 此时服务B将无法启动成功, 报错信息如下:  
  1. 多个协议包中的RPC接口冲突

我们设想这样一个场景, 服务A和服务C分别提供了一个协议包, 服务B在项目中引入了这两个服务的协议包 假设服务A和服务C协议包中分别存在如下RPC接口:   服务B将无法启动, 报错信息如下:  
  1. 使网关路由失效

我们设想这么一个场景, 网关做登入拦截时需要RPC调用用户服务, 于是用户服务A提供了一个协议包给网关 假设协议包中存在如下RPC接口: 此时服务B来接入网关(将聚合接口接入到 xxx.acg.team 域名下), 并绑定至 http://xxx.danchuangglobal.com/** 这个路由. 如果服务B中存在以下聚合接口: 通过 http://xxx.acg.team/user/info 访问时, 网关无法正确的将请求转发至服务B, 并且报错信息如下:  

为什么在FeignClient接口上添加RequestMapping注解会产生以上问题?

  1. 扫描到的FeignClient接口会被注册为一个SpringBean (即使是消费方)
  2. Spring认为类上携带RequestMapping注解的Bean会是一个Handler (对于消费方来说, 这是一个错误的判定)
  1. 一个应用中不允许注册多个相同的URL Handler, 所以如果消费方已有的接口URL与RPC接口的URL相同时就会报错
  2. 对于网关, 请求进入网关时, 假设网关自身存在匹配URL的Handler, 则会短路处理, 而不会再去通过路由转发至下游 (实质上这并不是网关真实的Handler), 这导致了路由的失效
 

应该怎么调整优化?

  1. 将FeignClient接口上的RequestMapping注解转移到对应的实现类上, 如下:
  1. 在FeignClient接口注解上添加 path 属性, 值与实现类的RequestMapping值相同

标签:FeignClient,网关,服务,RequestMapping,接口,RPC,注解
来源: https://www.cnblogs.com/imyjy/p/16469625.html