前言
OpenFeign 是现在微服务技术体系中比较主流的服务间调用工具,OpenFeign是基于Feign,扩展了Feign的一些组件,其实Feign单独使用也能做到服务间的调用,了解Feign的工作原理也能更好的使用OpenFeign ,本文就来简单了解下
一、先来一个小的Demo感知下Feign的作用
新建一个SpringBoot项目(SpringBoot是真的好用 当然底层也很复杂)
用Api工具测试下 ,
再新建一个测试项目,写一个Feign测试类验证一些
可以看到跟用Api工具调用的结果一样
这里我们就可以稍微发散下了
可以看到代码里面只有接口,没有接口方法实现,怎样实现接口的功能呢,说到这里我们有没有想到JAVA里面一个重要的知识点呢?(对了就是动态代理)
另外看打印的结果这个接口方法实现最终应该是发起了Http请求,也就是Feign框架内部通过动态代理实现接口逻辑,逻辑实现中发起了http请求,接下来我们简单来看下Feign框架的内部流程
二、Feign工作流程
1.Feign的build方法
Feign是一个抽象类,builder方法是抽象类内部的一个静态方法创建了一个内部静态类Builder
查看源码可以看到Builder内部类定义了一些组件(日志,重试机制 ,编解码,请求拦截器,handler工厂,Client请求客户端),也正是这些组件辅助完成了Feign的Http请求调用功能,这些组件在Builder父类中有默认的实现
这里顺便说下OpenFeign就是扩展了这里面其中部分组件,比如这里面的Client实现了发送http请求的功能,OpenFeign 实现自己的Client就能扩展额外的功能(支持负载均衡),实现自己Contract对象就能解析Spring 注解
2.Builder对象target方法
接下来再看下demo,调用builder方法后接着调用内部类的target方法
这里创建了 ReflectiveFeign 类
3.ReflectiveFeign 对象newInstance方法
看到newInstance这个方法名大概能猜到具体是做什么的了,跟踪源码可以看到它创建了一个代理对象(前面例子中的demo就是生成的代理对象了,调用任何方法都会走到构造代理类的Handler invoke 方法里面)
这个Handler在Feign框架中默认是FeignInvocationHandler,由ReflectiveFeign的成员变量InvocationHandlerFactory创建,我们再回来看看在创建ReflectiveFeign时构造函数里面传来什么进来
Contract | 协议对象,Feign默认对象中注册了 Headers RequestLine Body Headers Param QueryMap HeaderMap注解处理器 在调用Contract parseAndValidateMetadata方法将对应接口转换成MethodMetadata集合时有用到 |
MethodHandler.Factory<Object> | 工厂类 提供工厂方法创建 MethodHandler接口实现类 SynchronousMethodHandler,构造函数传入Feign的内部组件 实现底层参数解析 HTTP调用功能 |
InvocationHandlerFactory | 工厂类提供方法创建 InvocationHandler 接口实现类 FeignInvocationHandler ,后面看FeignInvocationHandler 的源码我们可以知道 ,FeignInvocationHandler 内部有一个Method到 MethodHandler的映射 ,对代理对象的调用 都是从这个映射里面找到对应的MethodHandler 执行,这个map就依赖于前面两个参数了 |
Feign底层调用流程,类之间的依赖关系还是比较容易看懂的,花了一张图来简单辅助下记忆
总结
Feign框架总体上封装了底层发起网络请求的实现,内部定义了Client ,编解码,Request参数构建等组件,提供一个Feign抽象类 通过target方法来创建代理类,其它框架可以通过实现自己的Feign对象 ,Builder对象 还有内部各组件来扩展功能