前言
在《Hystrix源码浅析》中分析过request cache的相关源码实现,而在Feign中集成了
Ribbon与
Hystrix两个重要组件,但很遗憾其默认设计中并没有对hystrix request cache的实现。故而本章节将从源码出发,了解Feign是如何集成Hystrix组件的,以便后续我们扩展Hystrix在Feign中的应用。正文部分将分为4个阶段分析,为何是4个阶段呢,看了就明白啦。
正文
第一阶段
直接切入正题,找到
FeignClient的自动配置类
FeignClientsConfiguration,编解码器均在当前配置类中设定,我们关注的feign(此处
Feign.Builder最终将帮助我们创建feign实例)客户端定义如下
如上图,可以看到其中有一个内部类
HystrixFeignConfiguration,其注册有两个条件:
- 在classpath中找到HystrixCommand、HystrixFeign类;
- 同时在feignHystrixBuilder方法上可以看到其还需要feign.hystrix.enabled配置为true(如果没有配置,默认值为false);
只有满足了以上两个条件的,方会注册含有ystrix的feign客户端实例,在一个应用中我们会定义多个feignClient,我们需要设定Bean的
scope为
prototype。
反之,如果没有同时满足上述两个条件,将会默认注册一个常规的
FeignBuilder实例。
在源码中还有
FeignAutoConfiguration作为feign的自动配置,
红色框中已经标出了重点,很明显两个自动装配过程通过“
feign.hystrix.HystrixFeign”类是否在classpath中作为判断依据形成了一个互斥约定,贴合本章重点,我们已经加入了Hystrix相关的依赖,故其会自动装配
HystrixTargeter实例。进入
HystrixTargeter类中,其核心实现在
target方法中,
通过4个红色框标记了我们需要分析的四点:
- 根据之前的分析,我们当前装载的builder为HystrixFeign.builder,可直接转型;
- 先记住此处的setterfactory设定,其将在构造HystrixCommand时起到关键作用,如下是一个Default实现:
在Feign类中定义了生成
commandKey的实现,其主要依据
feignclient实例和method生成,由‘类名称#方法名+参数列表中参数类型’组成;
- 优先获取FeignClientFactoryBean中fallback定义,如果获取到则直接通过fallback定义类生成包含回退方法的feignClient代理;
- 如果没有定义