FeignContext详解
2019-07-23 本文已影响0人
王勇1024
FeignContext是用于创建和管理Feign Client所依赖的各种类的工厂类。
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