专栏名称: hryou0922
目录
相关文章推荐
湖北经视  ·  这次,郑钦文赢了! ·  2 天前  
湖北经视  ·  254.4万元,再现天价手机号!最低月消费1 ... ·  2 天前  
丁香园肿瘤时间  ·  「她力量,绽芳华」国际 3·8 ... ·  4 天前  
51好读  ›  专栏  ›  hryou0922

Spring cloud系列十五 使用线程池优化feign的http请求组件

hryou0922  · 掘金  ·  · 2018-04-12 02:10

正文

Spring cloud系列十五 使用线程池优化feign的http请求组件

1. 概述

在默认情况下 spring cloud feign在进行各个子服务之间的调用时,http组件使用的是jdk的HttpURLConnection,没有使用线程池。本文先从源码分析feign的http组件对象生成的过程,然后通过为feign配置http线程池优化调用效率。

2. 源码分析

我们分析源码spring cloud feign。在spring-cloud-netflix-core/META-INF/spring.factories中可以看到,在spring boot自动配置会初始化FeignRibbonClientAutoConfiguration,这个类会生成Ribbon的使用http组件。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.netflix.feign.ribbon.FeignRibbonClientAutoConfiguration,\

分析配置类是FeignRibbonClientAutoConfiguration 下面分析此类import的3个类:HttpClientFeignLoadBalancedConfiguration,OkHttpFeignLoadBalancedConfiguration,DefaultFeignLoadBalancedConfiguration

@Import({ HttpClientFeignLoadBalancedConfiguration.class,
	OkHttpFeignLoadBalancedConfiguration.class,
	DefaultFeignLoadBalancedConfiguration.class })
public class FeignRibbonClientAutoConfiguration {
 …
}

HttpClientFeignLoadBalancedConfiguration 为feigin配置appache client的线程池 当引入ApacheHttpClient.class类时,会初始化这个配置类 方法feignClient()中:根据@ConditionalOnMissingBean(Client.class)知道如果有HttpClient 对象,则创建的ApacheHttpClient使用自己定义的HttpClient 。如果没有,则使用默认值。最后生成LoadBalancerFeignClient对象

@Configuration
@ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
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);
	}
}

OkHttpFeignLoadBalancedConfiguration 为feigin配置OkHttp,类似apache httpclient, 这里略。 DefaultFeignLoadBalancedConfiguration 为feigin配置HttpURLConnection, 方法feignClient():只有以上两个Client没有生产对象时,才在这个方法中使用Client.Default生成LoadBalancerFeignClient







请到「今天看啥」查看全文