Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啓動的時候注入一些bean,其代碼如下
@ConditionalOnClass({ ILoadBalancer.class, Feign.class })
@Configuration
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignRibbonClientAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory) {
return new LoadBalancerFeignClient(new Client.Default(null, null),
cachingFactory, clientFactory);
}
}
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架爲HttpURLConnection,代碼如下:
@Override
public Response execute(Request request, Options options) throws IOException {
HttpURLConnection connection = convertAndSend(request, options);
return convertResponse(connection).toBuilder().request(request).build();
}
怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼
@ConditionalOnClass({ ILoadBalancer.class, Feign.class })
@Configuration
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignRibbonClientAutoConfiguration {
...//省略代碼
@Configuration
@ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
protected static class HttpClientFeignLoadBalancedConfiguration {
@Autowired(required = false)
private HttpClient httpClient;
@Bean
@ConditionalOnMissingBean(Client.class)
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory) {
ApacheHttpClient delegate;
if (this.httpClient != null) {
delegate = new ApacheHttpClient(this.httpClient);
}
else {
delegate = new ApacheHttpClient();
}
return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
}
}
...//省略代碼
}
從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled爲true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就爲true.
在pom文件加上:
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>RELEASE</version>
</dependency>
同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>RELEASE</version>
</dependency>
需要java B2B2C 源碼 Springcloud多租戶電子商城系統源碼加企鵝:三五三六二四七二五九,從現在開始,我這邊會將近期研發的spring cloud微服務雲架構的搭建過程和精髓記錄下來,幫助更多有興趣研發spring cloud框架的朋友,大家來一起探討spring cloud架構的搭建過程及如何運用於企業項目。