此篇文章不从源码角度解析,网上一搜一大把。我个人的习惯是自己评估与思考下大概的设计思路是什么,然后看源码与博客佐证。否则一来就是使用然后看源码,一坨一坨的代码,真的看的头疼。以上仅是个人的学习方法。
聊聊OpenFeign,其实这个框架,之前用过,但没留意太多;说白了这个框架的出现就是为了让我们做RPC调用时偷个懒,是的,程序猿到了一定的境界都是想着偷懒。
OpenFeign是集成到了Spring Cloud基于Feign框架实现调用的,因此主要就是Spring容器如何管理Feign中关键对象的问题了。其实说白了最关键的就是这个。任何的原生框架只要集成到Spring框架中,就一定要解决这个问题。
从使用来看,OpenFeign只是定义了两个注解,而且注解还是标注在接口上,没任何的实现类,这妥妥的偷懒神器!因此要集成到Spring中,就需要考虑这些接口的问题了。
比如我有一个DemoController,接口是DemoClient。
那么如何在DemoController中调用DemoClient接口的方法是直接可以通过Spring容器的@Autowired注解解析而后调用接口方法呢?感觉有点熟悉,是的Mybatis集成到Spring,也是一样的。一个Mapper接口,然后就是一堆的方法,加上注解,在Controller中一调用@Autowired注解,得,直接返回成型的数据了。其实这两原理是一样的。
前面大概梳理了下思路,当然只是一部分。但也是最最关键的一个入口。
OpenFeign通过@Import注解引入实现了ImportBeanDefinitionRegister接口的FeignClientsRegistrar类;该类会初始化以及解析相应的配置。比如是否启用,哪些接口标识了要进行RPC调用的等。
OpenFeign定义了FactoryBean工厂实现接口类在Spring容器中的注入;
以上最关键的集成动作其实就是做完了的。如此,Feign其实就算集成进来了。
接下来就是实际的调用。
DemoClient是一个接口,我们实际调用的时候是接口中的某个方法。因此,就需要在调用方法是拦截,走代理的方式在调用处理器中加入逻辑。这个逻辑就是方法API与方法处理器的映射。
比如我调用DemoClient的hello方法,其实就是在调用远程服务的/xxx/hello API。因此需要拦截调用。把Spring MVC上的注解逻辑解析生成调用的API,最后发起客户端调用。
而客户端调用的逻辑是什么?不就是HttpClient的Get与Post调用了么!将客户端调用抽象为一个Client,按业务场景可以有不同的实现,比如默认使用JDK自带的HttpUrlConnection、或是第三方的OkHttp、HttpClient、以及负载均衡后的调用。
泳道图如下