Feign
2020-04-25 13:41:26 0 举报
Feign流程
作者其他创作
大纲/内容
HttpClientFeignLoadBalancedConfiguration
@AutoConfigureBefore(FeignAutoConfiguration.class)FeignRibbonClientAutoConfiguration依赖FeignAutoConfiguration并且导入这三个类加载
获取实例
1.初始化Feign.Builder:HystrixFeign.builder()
FeignClientFactoryBean#get使用上下文获取target,因为feign和hystrix默认整合所以默认是HystrixTargeter
AbstractLoadBalancerAwareClient#buildLoadBalancerCommand调用command#build方法生成LoadBalancerContext
SynchronousMethodHandler#executeAndDecode1.调用targetRequest(template)构建request对象2.LoadBalancerFeignClient执行execute方法
Feign.Builder初始化SetterFactory setterFactory = new SetterFactory.Default()变量中初始化SetterFactory
client注入此Factory
HystrixFeign#Build调用此方法来初始化相关类并调用类的build方法来生成反射类
LoadBalancerCommand#submit
FeignClientFactoryBean#getTarget1.获取独立的spring上下文容器2.获取Feign.Build3.判断是否置顶url,如果没指定则使用负载均衡来生成代理对象
拿到此服务器
InvocationHandlerFactory#Create返回HystrixInvocationHandler,在HystrixFeign的build方法中重写的create
FeignClientFactoryBean#configureFeign1.读取application.properties中的配置信息2.将配置信息放进build中
feign.target调用此方法
spring.factories
获取Feign动态代理对象
LoadBalancerFeignClient#execute1.在这里注入的是此client
读取application.properties文件
applicationContext.getBean(FeignContext.class);获取此服务的上下文
获取初始化的client
CachingSpringLoadBalancerFactory#create创建FeignLoadBalancer
FeignClientFactoryBean#loadBalance(执行上述初始化后调用此方法)
触发配置
HystrixInvocationHandler#toSetters在此生成Setter对象,
Feign#Build新建ReflectiveFeign对象
FeignClientFactoryBean#getOptional获取Client
ILoadBalancer#chooseServer负载均衡选择服务器
FeignClientsRegistrar#registerFeignClients1.将被FeignClient注解修饰的类转换成BeanDefinitionBuilder加入到SpringContext容器中2.beanDefinition类为FeignClientFactoryBean,故在Spring获取类的时候实际返回的是FeignClientFactoryBean类。3.FeignClientFactoryBean作为一个实现了FactoryBean的工厂类,那么每次在Spring Context 创建实体类的时候会调用它的getObject()方法。
AbstractLoadBalancerAwareClient#executeWithLoadBalancer调用FeignLoadBalancer父类的方法
FeignInvocationHandler代理类
HystrixTargeter#target1.调用此targeter的target方法获取生成的对象2.如果熔断降级则调用targetWithFallbackFactory方法
DefaultFeignLoadBalancedConfiguration
中间详细调用查看Hystrix组件
LoadBalancerFeignClient #lbClient
Feign#invocationHandlerFactory生成HystrixInvocationHandler对象并注入父类的属性中
@EnableEurekaClient
ReflectiveFeign#newInstance在此生成FeignInvocationHandler对象返回其中包含target(里面是serviceName等信息)和dispatcher(map数据结构,key是请求的方法名,方法参数等,value是SynchronousMethodHandler)
1.初始化Client:LoadBalancerFeignClient
1.初始化CachingSpringLoadBalancerFactory#CachingSpringLoadBalancerFactory
FeignClientsRegistrar#registerDefaultConfiguration
SynchronousMethodHandler#invoke反射调用
LoadBalancerContext #getServerFromLoadBalancer在此负载均衡
FeignClientFactoryBean#getObject
HystrixInvocationHandler#构造器初始化此Handle
FeignClientsRegistrar#registerFeignClients1.扫描所有的包找到被FeignClient注解修饰的类并解析注册2.往下继续调用
LoadBalancerCommand#selectServer在此负载均衡
FeignClientsRegistrar#registerBeanDefinitions继承了ImportBeanDefinitionRegistrar拥有了会注册bean的能力,调用其接口的方法来注册bean
依赖
@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients
1.初始化FeignContext:FeignContext2.初始化Targeter:HystrixTargeter3.初始化Targeter:DefaultTargeter
调用者
FeignClientFactoryBean#feign1.利用生成的本服务容器创建FeignLoggerFactory对象2.利用生成的本服务容器创建HystrixFeign.builder()
@Autowride
@Import(DefaultGzipDecoderConfiguration.class)FeignAutoConfiguration
Feign
HystrixInvocationHandler#invoke熔断组件找到响应的方法调用
将配置信息设置到build中
@Configuration(proxyBeanMethods = false)FeignClientsConfiguration
OkHttpFeignLoadBalancedConfiguration
0 条评论
下一页
为你推荐
查看更多