Feign:运行逻辑图(未完成)
2020-11-20 14:32:13 0 举报
Feign运行逻辑图
作者其他创作
大纲/内容
ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsBeanDefinitionReader会从对应的包中加载出Bean定义
AbstractLoadBalancerAwareClient.executeWithLoadBalancer
new FeignLoadBalancer.RibbonRequest????
Hystrix实际执行方法
Targeter代理对象生成器(cloud Feign包)
new AnnotationTypeFilter(FeignClient.class);scanner.addIncludeFilter(annotationTypeFilter);设定Scanner扫描出携带@FeignClient的类
ConfigurationClassPostProcessor.registerBeanDefinitions
扫描出注释了@FeignClient的接口注册FeignClientFactoryBean生产Bean
FeignClientFactoryBean配置Feign.Builder使用Targeter构建出代理对象
FeignFeign自带,SpringCloud不启用
Feign 与 Hystrix 结合
Set<BeanDefinition> = scanner .findCandidateComponents(basePackage)扫描包路径,获取Bean定义
applicationContext.getBean(FeignContext.class)获取Feign上下文
BeanDefinitionRegistryPostProcessor特殊Bean工厂后置处理器在其他Bean工厂后置处理器前被调用,一般用来注册Bean定义
registerDefaultConfiguration非重点,后续再看
HystrixInvocationHandler.invoke调用Hystrix代理接口方法
配置Feign.Builder
生产nameToHandler
MethodHandler.invoke执行method对应的实际方法
ParseHandlersByName
Client
HystrixDelegatingContract修改了一些Rx和Hystrix相关的返回类型
RequestTemplate.Factory.create(args)创建RequestTemplate
FeignClientsRegistrar.registerBeanDefinitions在后置工厂处理器注册的时机一起触发注册BeanDefinition
Contract.Default
return executeAndDecode(template)请求远程接口并返回结果
SpringCloud环境默认
HystrixFeign默认
defaultMethodHandler.bindTo(proxy)使用一组defaultMethodHandler绑定代理对象
default
FeignClientFactoryBean.getObjectFeignClient工厂Bean
T = decode(response)解码返回结果
feign.okhttp.enabled = true
使用元数据信息和一些其他组件创建MethodHandler实际方法执行器
非SpringCloud环境默认
Encoder编码器(feign包)
FactoryBean.getObject工厂Bean生产出实际的Bean(Spring)
如果是default接口直接执行default方法如果不是default接口则执行SynchronousMethodHandler.invoke
LoadBalancerFeignClient
ApacheHttpClient
HystrixFeign.build()注入
Request = Target.apply(new RequestTemplate(template));创建Request
使用LoadBalancerFeignClient提交数据
supper.Build
List<RequestInterceptor>.forEach.apply使用拦截器对请求进行一系列的处理(ByteTcc框架使用了该拦截器)
nameToHandlerMap<接口方法名,代理执行方法>
RequestSpecificRetryHandler = getRequestSpecificRetryHandler
Method method : target.type().getMethods()
调用代理接口方法
HystrixTargeter
feign.httpclient.enabled = true
Ribbon 源码
Contract
使用扫描出来的Bean定义的元数据信息注册FeignClientFactoryBean生产Bean(spring)
InvocationHandlerFactory
OkHttpClient
Feign 与 Ribbon 结合
Targeter
将 FeignClient工厂Bean,Feign上下文,Feign构造器,HardCodedTarget作为参数利用Targeter生产出代理实例对象
ParseHandlersByName.apply(target)使用ParseHandlersByName生产nameToHandler
调用请求获取结果
Hystrix 与 Feign 的结合处
retryer.continueOrPropagate(e)重试策略
HystrixDelegatingContract
Contract契约(feign包)
Spring 知识点
ImportBeanDefinitionRegistrar.loadBeanDefinitionsFromRegistrars使用一系列的ImportBeanDefinitionRegistrar进行Bean定义注册
Spring Cloud Feign 知识点
使用Scanner扫描出注释了@FeignClient的Bean定义(Spring)
FeignLoadBalancer = CachingSpringLoadBalancerFactory.create(clientName)
methodToHandlerMap<接口method,代理执行方法>
Response = IResponse.toReponse
FeignClientProperties客户端配置(cloud feign包)
ReflectiveFeign.FeignInvocationHandler代理对象执行方法
ClientFeign客户端(Feign包)
new ReflectiveFeign.newInstance(target)
LoadBalancerFeignClient.execute
ClassPathScanningCandidateComponentProvider = getScanner获取用来搜索BeanDefinition的扫描器(Scanner 是 Spring知识)
HystrixInvocationHandler
LoadBalancerCommand.sumbit.toBlocking.single执行负载均衡命令(Rx)
registerFeignClients注册所有的FeignClient客户端
HystrixFeign.Build()
BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class)创建一个新的Bean定义,使用FactoryBean进行注册
SpringMvcContractSpringMVC注解解析器
Feign
url=\"http://\"+this.name+cleanPath()组装url(如果设置了url则不需要组装,this.name)
Feign 源码
Feign.Build().target(target);feign源码入口
ReflectiveFeign.FeignInvocationHandler.invoke调用代理接口方法
T result = FeignLoadBalancer.executeWithLoadBalancer
ConfigurationClassPostProcessor后置工厂处理器注册BeanDefinition(Spring)
Decoder解码器(feign包)
LoadBalancerCommand = buildLoadBalancerCommand构造负载均衡命令
Feign.BuilderFeign构建器(feign包)
使用AbstractLoadBalancerAwareClient提交数据(Ribbon)
@Import(FeignClientsRegistrar.class)注入一个继承了ImportBeanDefinitionRegistrar的Feign客户端注册器
AnnotationMetadata annotationMetadata = beanDefinition.getMetadata()annotationMetadata.getAnnotationAttributes( FeignClient.class.getCanonicalName());不直接注册扫描出来的Bean定义,而只是利用该Bean定义的元数据信息同时@FeignClient的配置也是在此处被读出
List<MethodMetadata> metadata =contract.parseAndValidatateMetadata(key.type())分析类获取方法上的元数据信息(重点)
使用 Feign 生成 代理对象(重点是代理方法的生成)
DefaultTargeter.target
LoadBalancerCommand = LoadBalancerCommand.Builder.build
ParseHandlersByName.apply(target)
new HystrixCommand().execute实际上也就是加了一层装饰,使用HystrixCommand提交罢了
在配置类上添加注解@EnableFeignClients
0 条评论
回复 删除
下一页