Feign调用转成本地方法调用

Feign调用转成本地方法调用

背景

最近项目因为某些原因,将服务A和服务B合并成了一个服务(参考上篇:基于spring cloud gateway & springmvc服务合并)。合并完成之后原来服务A和服务B通信,通过Feign调用由原来的链路服务A->服务B变成了服务A->服务A;合并完的调用链路一次外部请求会消耗更多的web容器资源,间接降低服务A的对外提供服务能力

目标

优化调用链路,降低无谓web容器资源消耗

思路

既然服务B已经合并到服务A了,实际上原有的服务B的http接口直接通过本地方法去调用就可以。

但是,如果一个个调用处去直接改,工作量极大;且后期资源足够的情况下服务B再拆出来,又需要再次替换为Feign调用。能否通过强大的AOP,在尽可能少的代码改动下实现呢;答案是可以的

实施

找到接口和本地方法的映射

我们知道,springmvc每个url都会对应一个Controller的方法(HandlerMethod),所以我们只需要将服务B的所有controller都扫描一遍,即可建立对应的映射关系

那如何拿到这些controller呢?

  1. 拿到ServletContext

  2. 通过ServletContext拿到WebApplicationContext

  3. 通过WebApplicationContext拿到所有的RequestMappingHandlerMapping

  4. 通过RequestMappingHandlerMapping拿到HandlerMethod

  5. 解析HandlerMethod拿到url和对应的RequestMethods

参考代码如下

解析ServiceB FeignClient所有方法,找到可以转为本地方法的method,并建立映射关系

FeignClient接口方法上通常都会有几个注解@RequestMapping/@GetMapping/@PostMapping

所以只需要解析到这几个注解,就可以拿到对应方法请求的url和RequestMethod

结合上面拿到的url和HandlerMethod的映射关系,我们就可以建立FeignClient中的方法和HandlerMethod的映射关系

代码如下

定义AOP

参考代码如下

最后更新于