Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
简而言之:
• Feign 采用的是基于接口的注解
• Feign 整合了ribbon
feign作用
封装了Http调用流程,更适合面向接口化的变成习惯
在服务调用的场景中,我们经常调用基于Http协议的服务,而我们经常使用到的框架可能有HttpURLConnection、Apache HttpComponnets、OkHttp3 、Netty等等,这些框架在基于自身的专注点提供了自身特性。而从角色划分上来看,他们的职能是一致的提供Http调用服务。
feign核心类介绍
feign.Feign.Builder 设置发送http请求的相关参数,比如http客户端,重试策略,编解码,超时时间等等
feign.Contract.Default 解析接口方法的元数据,构建http请求模板
feign.Client 发送http请求客户端,默认实现feign.Client.Default,使用的是java.net包实现的
Retryer 重试,默认实现feign.Retryer.Default,超时延迟100ms开始重试,每隔1s重试一次,重试4次
Options 超时时间,默认连接超时10s,读超时60s
feign.codec.Encoder 编码器
feign.codec.Decoder 解码器
RequestInterceptor 请求拦截器,可以在发送http请求之前执行此拦截器
feign.Contract 接口以及方法元数据解析器
以上参数都可以自己扩展
HardCodedTarget 定于目标接口和url
ReflectiveFeign 生成动态代理类,基于jdk的动态代理实现
feign.InvocationHandlerFactory.Default 接口方法统一拦截器创建工厂
FeignInvocationHandler 接口统一方法拦截器
ParseHandlersByName 解析接口方法元数据
SynchronousMethodHandler.Factory 接口方法的拦截器创建工厂
SynchronousMethodHandler 接口方法的拦截器,真正拦截的核心,这里真正发起http请求,处理返回结果