美文网首页Spring
FeignContext详解

FeignContext详解

作者: 王勇1024 | 来源:发表于2019-07-23 07:37 被阅读0次

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所依赖的类包括:

  • AnnotationConfigApplicationContext:
  • FeignLoggerFactory:Feign的日志工厂类,每一个Feign Client会关联一个Logger实例;
  • Feign.Builder:用于创建feign.Client实例;
  • feign.Client:
  • feign.codec.Encoder:
  • feign.codec.Decoder:
  • feign.codec.ErrorEncoder:可以通过ErrorEncoder将请求过程中捕获到的异常转换成指定的形式,从而避免调用方无法解析异常。
  • feign.Contract:
  • feign.Retryer:用于处理当Feign Client在请求过程中时捕获到 RetryableException时所要采取的动作;
  • feign.Request.Options:可以设置connectTimeoutMillis和readTimeoutMillis;
  • feign.RequestInterceptor:

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:不重试。

各类关系图

各类关系图

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

  • FeignContext:斯塔克大厦;全局唯一,所有组成的钢铁侠盔甲零件都在这里存放;
  • Fegin.Client:托尼·斯塔克本人;自己体力很弱,没有了盔甲就不能惩奸除恶;
  • Feign.Builder:组装钢铁侠盔甲的工具;把一套盔甲的所有零件组装到托尼·斯塔克身上,从而变成了无敌的钢铁侠;每一套钢铁侠盔甲都有一个独立的组装工具;
  • AnnotationConfigApplicationContext:存放钢铁侠盔甲所需各种零件的仓库,每一套钢铁侠盔甲有一个独立的仓库;当需要的时候,组装工具把各种零件从仓库中取出来,组装到托尼·斯塔克身上;
  • 其他类:组成钢铁侠盔甲的各种零件。
钢铁侠

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协议

相关文章

网友评论

    本文标题:FeignContext详解

    本文链接:https://www.haomeiwen.com/subject/sbxelctx.html