Feign结合Hystrix源码分享

110 阅读1分钟

Feign基本组成

作为一个远程调用框架,主要由以下部分组成(参考FeignClientProperties配置类)

  • Client:http客户端,可以是ApacheHttpClient、OkHttpClient、jdk原生
  • RequestInterceptor:请求拦截器
  • Retryer:重试,默认不重试,Retryer.NEVER_RETRY
  • Encoder:编码
  • Decoder:解码
  • ErrorDecoder:异常捕获
  • LoggerLevel:日志级别
  • Contract:定义哪些注释和值在接口上有效。提取注解上有用信息,封装成MethodMetadata元数据的。比如@QueryMap、@HeaderMap、@Body等注解的解析
  • Decode404:是否对404返回码做特殊处理
# 简单配置示例:

feign:
  client:
    config:
      # 针对所有的服务
      default:
        connectTimeout: 2000
        readTimeout: 2000
        loggerLevel: BASIC
        retryer: feign.Retryer.Default
      # 针对某个服务(服务名:use-service)
      use-service:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: BASIC
        retryer: feign.Retryer.Default

image.png

注册BeanDefinition到Spring容器中

image.png

class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar

FeignClientsRegistrar 注册的是FactoryBean工厂类

image.png

image.png

image.png

整个注册过程如图

image.png

创建feign代理对象

FeignClientFactoryBean

image.png

  • FeignContext是全局配置类,他持有所有的feign客户端的configuration配置和AnnotationConfigApplicationContext类,用于获取自动自动装配类的一些配置信息。
  • Feign.Builder 使用了建造者模式,用于创建最后的Feign对象
  • Client:http客户端
  • Targeter 有两种实现:一个是DefaultTargeter,直接调用 Feign.Builder; 还一个是 HystrixTargeter,调用 HystrixFeign.Builder,开启熔断。在FeignAutoConfiguration配置生效HystrixTargeter

HystrixFeign.Builder

image.png

Feign.Builder

image.png

ReflectiveFeign

Feign是个抽象类,唯一的继承是ReflectiveFeign,也是真正的创建动态代理的地方 image.png

SynchronousMethodHandler

将feignClient中每个方法解析成MethodHandler对象 image.png

feign调用过程

image.png

feign各个主要类和接口

image.png

feign整体创建过程方法调用时序图

image.png