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 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 