Spring

FeignContext详解

2019-07-23  本文已影响0人  王勇1024

FeignContext是用于创建和管理Feign Client所依赖的各种类的工厂类。
FeignContext的继承关系如下图所示:

FeignContext

contexts

每个Feign Client会关联一个AnnotationConfigApplicationContext实例,用于存取Feign Client所依赖的各种类的实例。并以FeignContext-{feign-client-name}作为key。

configurations

configurations中保存了每个Feign Client所依赖的配置类,在创建AnnotationConfigApplicationContext的过程中,这些配置类会被注入到Bean工厂中。

Feign Client

Feign Client所依赖的类包括:

Feign.Builder

  public static class Builder {

    private final List<RequestInterceptor> requestInterceptors =
        new ArrayList<RequestInterceptor>();
    private Logger.Level logLevel = Logger.Level.NONE;
    private Contract contract = new Contract.Default();
    private Client client = new Client.Default(null, null);
    private Retryer retryer = new Retryer.Default();
    private Logger logger = new NoOpLogger();
    private Encoder encoder = new Encoder.Default();
    private Decoder decoder = new Decoder.Default();
    private ErrorDecoder errorDecoder = new ErrorDecoder.Default();
    private Options options = new Options();
    private InvocationHandlerFactory invocationHandlerFactory =
        new InvocationHandlerFactory.Default();
    private boolean decode404;
}

Retryer

Retryer 类用于处理当Feign Client在请求过程中时捕获到 RetryableException时所要采取的动作。

public interface Retryer extends Cloneable {
  // 当捕获到 RetryableException 异常时,所要执行的操作
  void continueOrPropagate(RetryableException e);
  // 对象拷贝
  Retryer clone();
}

它有一个默认的实现类:Default,以及一个默认实例:NEVER_RETRY。
Default:可以指定重试周期和最大重试次数;
NEVER_RETRY:不重试。

各类关系图

各类关系图

如果大家对各个类之间的关系还是比较迷惑,我们可以用钢铁侠来做一下类比(网上盗图,如有侵权请联系笔者删除):

钢铁侠

Feign Client的两种配置方式

Feign Client所依赖的类中我们已经知道实例化 Feign Client 过程中所依赖的一些配置。feign支持两种方式来完成 Feign Client 的配置。

配置文件

可以在spring配置文件中指定以feign.client为前缀的配置项来配置Feign Client,这些配置项包括:

feign.client.default-config=default
feign.client.config.{client-name}.connect-timeout=1000
feign.client.config.{client-name}.contract=feign.Contract.Default
feign.client.config.{client-name}.decode404=false
feign.client.config.{client-name}.decoder=feign.Decoder.Default
feign.client.config.{client-name}.encoder=feign.Encoder.Default
feign.client.config.{client-name}.error-decoder=feign.Contract.Default
feign.client.config.{client-name}.logger-level=FULL
feign.client.config.{client-name}.read-timeout=1000
feign.client.config.{client-name}.request-interceptors[0]=
feign.client.config.{client-name}.request-interceptors[1]=
feign.client.config.{client-name}.retryer=feign.Retryer.Default

在@FeignClient中指定configuration

参考:Feign支持Https协议

上一篇 下一篇

猜你喜欢

热点阅读