为什么不能在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值相同
posted @ 2022-07-12 12:23  EEEEET  阅读(1268)  评论(0编辑  收藏  举报