网上资料很多了,在这里mark下 feign源码
原理了解下
- 启动时,程序会进行包扫描,扫描所有包下所有@FeignClient注解的类,并将这些类注入到spring的IOC容器中。当定义的Feign中的接口被调用时,通过JDK的动态代理来生成RequestTemplate。
- RequestTemplate中包含请求的所有信息,如请求参数,请求URL等。
- RequestTemplate声场Request,然后将Request交给client处理,这个client默认是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。
- 最后client封装成LoadBaLanceClient,结合ribbon负载均衡地发起调用。
其实看源码,了解了原理,再看配置就能很快将框架梳理清楚
- FeignAutoConfiguration feign自动配置类
- FeignRibbonClientAutoConfiguration 类 feign ribbon 配置
@ConditionalOnClass({ ILoadBalancer.class, Feign.class })
@Configuration
@AutoConfigureBefore(FeignAutoConfiguration.class)
@EnableConfigurationProperties({ FeignHttpClientProperties.class })
//Order is important here, last should be the default, first should be optional
// see https://github.com/spring-cloud/spring-cloud-netflix/issues/2086#issuecomment-316281653
// 这里导入Apache HttpClient OkHttp3客户端配置及默认是JDK的HTTPUrlConnection
@Import({ HttpClientFeignLoadBalancedConfiguration.class,
OkHttpFeignLoadBalancedConfiguration.class,
DefaultFeignLoadBalancedConfiguration.class })
public class FeignRibbonClientAutoConfiguration
- FeignClientFactoryBean 创建bean代理对象(FeignInvocationHandler为代理对象的处理器), FeignInvocationHandler将请求转发给FeignInvocationHandler
feign和ribbon的负载均衡对比
- feign是在feign.SynchronousMethodHandler#executeAndDecode 方法内通过LoadBalancerFeignClient 进行负载均衡
- ribbon是通过org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor#intercept 方法内调用RibbonLoadBalancerClient 进行负载均衡