总结

1、FeignAutoConfiguration自动配置类,注册FeignContext,FeignContext继承NamedContextFactory,内部未每一个feiginclient创建一个spring容器
2、EnableFeignClients注解开启feign,@Import(FeignClientsRegistrar.class),注册配置和FeignClients
3、创建扫描器扫描@FeignClient注解标记的接口,注册为FeignClientFactoryBean类型的工厂bean
4、spring启动初始化bean时,调用工厂bean的getObject方法,生成代理对象
5、方法执行时,调用LoadBalancerFeignClient的execute方法,最终还是整合了ribbon,封装FeignLoadBalancer.RibbonRequest,实现负载均衡的调用。

源码解析

通过@EnableFeignCilents注解上的 @Import()注入FeignClientsRegistrar类
实现了spring的支持手动注册bean到容器里的逻辑
通过扫描项目(如果手动配置Clients参数就不会扫描项目),把所有注解@FeignClient扫描到,
遍历每个FeignClient并构建为FeignClientFactoryBean类,FactoryBean的getObject()会返回该bean的实例
Feign就是在getObject()里添加动态代理的逻辑
如果同时有url和name(value)会优先使用url,name会先走loadBalance
在初始化的时候feignclient封装成代理对象proxy,并且作为spring bean返回,
根据 feign.hystrix.enabled 配置确定由FeignInvocationHandler类或HystrixInvocationHandler类进行增强
实际调用FeignInvocationHandler的invoke(),封装请求,截取请求地址并且调用ribbon的负载均衡策略,获取真实的调用服务器的地址,发送请求,处理结果