文章目录
Feign支持三种类型的客户端:
- Default
- HttpClient
- OkHttpClient
Feign调用请求是使用
1. Default客户端
feign.client.Default
Default客户端是默认的请求调用客户端,其使用了JDK
包里的HttpURLConnection实现的。
其有明显的性能缺陷,因为没有使用连接池等高级功能,所以一般我们会对其进行替换。
1.1. 引入依赖
什么以来都不引入,什么配置都不做就是使用默认的客户端
2. HttpClient客户端
feign.httpclient.ApacheHttpClient
HttpClient客户端 使用了Apache
的org.apache.http.client.HttpClient
实现的。
可以配置连接池,来提升效率和性能
2.1 引入依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2.2. 配置
feign:
httpclient:
enabled: true
2.3. AutoConfiguration流程
- 1.AutoConfiguration配置入口:
org.springframework.cloud:spring-cloud-openfeign-core!META-INFO/spring-autoconfigure-metadata.properties
- 2.
org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration
- 3.
org.springframework.cloud.openfeign.ribbon.HttpClientFeignLoadBalancedConfiguration
- 4.
org.springframework.cloud.openfeign.ribbon.HttpClientFeignLoadBalancedConfiguration.HttpClientFeignConfiguration
- 5.
org.springframework.cloud.openfeign.FeignAutoConfiguration
2.3.1. FeignRibbonClientAutoConfiguration
配置生效条件
@ConditionalOnClass({ ILoadBalancer.class, Feign.class })
@Configuration
@AutoConfigureBefore(FeignAutoConfiguration.class)
@EnableConfigurationProperties({ FeignHttpClientProperties.class })
@Import({ HttpClientFeignLoadBalancedConfiguration.class,
OkHttpFeignLoadBalancedConfiguration.class,
DefaultFeignLoadBalancedConfiguration.class })
public class FeignRibbonClientAutoConfiguration {
.
.
.
}
2.3.2. HttpClientFeignLoadBalancedConfiguration
如果有feign.httpclient.enabled
属性那么该配置文件生效
这个配置文件主要是看feign.compression.response.enabled
配置
- 属性不配置 不初始化
- 属性为true 初始化customHttpClient
- 属性为false 初始化httpClient
@Configuration
@ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
class HttpClientFeignLoadBalancedConfiguration {
@Bean
@ConditionalOnMissingBean(Client.class)
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory, HttpClient httpClient) {
ApacheHttpClient delegate = new ApacheHttpClient(httpClient);
return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
}
@Configuration
@ConditionalOnMissingBean(CloseableHttpClient.class)
protected static class HttpClientFeignConfiguration {
@Bean
@ConditionalOnMissingBean(HttpClientConnectionManager.class)
public HttpClientConnectionManager connectionManager(...) {
...
}
@Bean
@ConditionalOnProperty(value = "feign.compression.response.enabled", havingValue = "true")
public CloseableHttpClient customHttpClient(...) {
...
}
@Bean
@ConditionalOnProperty(value = "feign.compression.response.enabled", havingValue = "false", matchIfMissing = true)
public CloseableHttpClient httpClient(...) {
...
}
}
}
3. OkHttpClient
feign.okhttp.OkHttpClient
OkHttpClient客户端 使用了OkHttp
的okhttp3.OkHttpClient
实现的。
可以配置连接池,来提升效率和性能
3.1 引入依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>