总结:@EnableFeignClients的时候,它会扫描指定路径下FeignClient注解声明的接口,生成动态代理的类,调用GetObject的时候最终会调用getTarget完成调用。
隔离上下文 NamedContextFactory中存储contexts;通过contextID(String)来得到AnnotationConfigApplicationContext,现在子容器中找,如果找不到再去父容器中找
总结:
Feign里边 发起请求,通过动态代理(FeignClientInvocationHandler),动态代理过程中有一个很重要的部分就是Contract(默认用的是SpringMVCContract,它会对我们请求的数据FeignClient模板进行解析),之后会得到一个MethodHandler,那么分发之前会做一个encorder序列化,将对象转换为成JSON格式,序列化之后通过Request发起请求,发起请求之前LoadBalancerFeignClient做负载均衡,可以通过logger进行日志记录,接着重试机制,如果发送失败,重新发送,接着发起HTTP请求;接着Response回应,反序列化。
总体:
Robbin的两种方式
@LoadBalancer
LoadBalancerClient
都是对RestTemplate进行操作
Robbin对得到的alllist和uplist进行负载均衡,根据IRule规则进行负载均衡(权重机制(区间算法)),/定时任务不断地发起模拟请求->LoadBalancerstat,Iping(每10s判断一次目标服务的地址,如果不可用则剔除无效地址)判断是否可用, serverList(定时任务,每30s更新一次服务列表)
如何自定义负载均衡算法,自定义
Feign->http通信:
让开发人员远程通信更加简单,对请求进行模板化开发,已经集成Robbin的使用。
对于Feign是如何扫描的,FeignClientRegister,对于每一个FeignClient注册一个工厂FeignClientFactoryBean;工厂Bean里边返回的是基于工厂bean的特性,生成动态代理类FeignInvokeHandler,使用JDK动态代理根据接口实现