Feign基本原理浅析

本文介绍了OpenFeign,一个基于Feign的服务间调用工具,通过示例和源码分析展示了其工作原理,包括Feign的构建过程、动态代理、内部组件如Client和编解码的运用,以及如何通过扩展实现额外功能。
摘要由CSDN通过智能技术生成

前言

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对象 还有内部各组件来扩展功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值