@EnableFeignClients注解会通过: @Import({FeignClientsRegistrar.class}) 扫描指定包路径下 添加了 @FeginClient 注解的接口,然后将其封装成 FeignClientFactoryBean 类型的 BeanDefinition,并注册到容器当中 key名称为 @FeginClient 中的value 属性。
FeignClientFactoryBean getObject()生成实际的对象,其实是一个动态代理的Client类型实例: 实际上就是 LoadBalancerFeignClient,当我们进行远程调用的时候,会通过 LoadBalancerFeignClient 实现负载均衡 execute()方法进行调用,会将请求中的服务名转换成实际调用的ip,port
LoadBalancerFeignClient 发送请求,然后首次根据请求的服务名通过DynamicServerListLoadBalancer.updateListOfServers()去eureka中获取服务信息,
实际调用的DiscoveryEnabledNIWSServerList的obtainServersViaDiscovery()方法通过EurekaClient 发送请求到eureka服务器获取配置,配置信息更新到
返回配置通过IRule(可以自行在yaml中未服务配置key:NFLoadBalancerRuleClassName)接口实现负载均衡.