前言
本文重点介绍 FeignAutoConfiguration 相关的配置,包括默认配置、自定义配置和相关属性配置。FeignAutoConfiguration 是 Feign 的自动化配置类,可以为项目自动配置 Feign 客户端。本文将逐一介绍 FeignAutoConfiguration 中各种配置的作用,包括通过配置文件或代码方式自定义 Feign 客户端、修改 Feign 的 HTTP 行为、设置 Feign 的日志级别等。同时,我们还提供了大量的代码示例和注释,帮助读者更深入地了解和掌握 FeignAutoConfiguration 的相关配置。通过本文的指导,您将能够更加灵活地配置 Feign 客户端,满足各种实际需求。
FeignAutoConfiguration
FeignAutoConfiguration
是Spring Cloud中自动配置Feign客户端的类。该类主要负责以下几个任务:
-
注册
FeignContext
bean,该bean用于存储所有已经创建的Feign客户端实例。@Bean public FeignContext feignContext() { FeignContext context = new FeignContext(); context.setConfigurations(this.configurations); return context; }
-
注册
FeignClientsConfiguration
bean,该bean用于自动配置所有使用@FeignClient
注解的接口,并将其注册到FeignContext
bean中。private List<FeignClientSpecification> configurations = new ArrayList();
类中包含了4个对于客户端配置
- DefaultFeignTargeterConfiguration
- HystrixFeignTargeterConfiguration
- OkHttpFeignConfiguration
- HttpClientFeignConfiguration
DefaultFeignTargeterConfiguration
@Configuration
@ConditionalOnMissingClass("feign.hystrix.HystrixFeign")
protected static class DefaultFeignTargeterConfiguration {
@Bean
@ConditionalOnMissingBean
public Targeter feignTargeter() {
return new DefaultTargeter();
}
}
DefaultFeignTargeterConfiguration
是Spring Cloud Feign提供的默认的Feign Targeter的配置类,用于配置Feign的默认目标接口转换器(DefaultTargeter)。
目标接口转换器是Feign用来将Feign客户端接口转换为目标接口的类。在Feign中,每个客户端接口都必须对应一个目标接口,该目标接口定义了客户端接口中所有的HTTP请求方法及其相关的参数、请求头、请求体和返回值等信息。目标接口转换器负责将客户端接口转换为目标接口,使得Feign能够使用这个目标接口来发送HTTP请求和接收响应。
DefaultFeignTargeterConfiguration
注册了一个名为defaultTargeter
的FeignTargeter
bean,并将其设置为默认的Feign目标接口转换器。该defaultTargeter
bean是DefaultTargeter
类的一个实例,它是Feign提供的默认目标接口转换器,它将客户端接口中的所有方法都映射为默认的HTTP请求方法(即GET方法),并将所有参数都映射为查询参数。
如果需要自定义目标接口转换器,可以创建一个实现了FeignTargeter
接口的自定义转换器,并在Spring容器中注册一个与该接口相应的bean即可。在创建Feign客户端时,可以通过@FeignClient
注解的configuration
属性来指定使用的目标接口转换器。
-
@ConditionalOnMissingClass(“feign.hystrix.HystrixFeign”)
这个注解表示当 classpath 中不存在
feign.hystrix.HystrixFeign
这个类时,才会生效。也就是说,如果项目中使用了feign-hystrix
,那么这个条件就不满足,这个配置就不会被使用。该注解的作用是在一些特定条件下才加载 Bean,以此来控制 Bean 的加载顺序和内容。
实现自定义的FeignTargeter
的例子
import feign.Target;
import feign.Target.HardCodedTarget;
import org.springframework.stereotype.Component;
@Component
public class MyFeignTargeter implements FeignTargeter {
@Override
public <T> T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignContext context, Target.HardCodedTarget<T> target) {
// 自定义目标接口转换器的实现
// 将目标接口中的所有方法都映射为POST方法,并设置Content-Type为application/json
return feign.target(target, new MyTarget<>(target.type()));
}
private static class MyTarget<T> implements Target<T> {
private final Class<T> type;
public MyTarget(Class<T> type) {
this.type = type;
}
@Override
public Class<T> type() {
return type;
}
@Override
public String name() {
return type.getSimpleName();
}
@Override
public String url() {
return "http://localhost:8080";
}
}
}
上述代码实现了一个自定义的FeignTargeter
,它将目标接口中的所有方法都映射为POST方法,并设置Content-Type为application/json。具体实现是在target
方法中完成的,它接受四个参数:factory
、feign
、context
和target
,分别代表FeignClient工厂bean、Feign.Builder实例、Feign上下文和目标接口。
在target
方法中,我们可以自由地实现自己的目标接口转换逻辑,并返回一个实现了Target
接口的对象作为目标接口的代理。在这里,我们使用了一个内部类MyTarget
作为目标接口的代理,它实现了Target
接口,并在url
方法中返回了硬编码的URL地址。
HystrixFeignTargeterConfiguration
@Configuration
@ConditionalOnClass(name = "feign.hystrix.HystrixFeign")
protected static class HystrixFeignTargeterConfiguration {
@Bean
@ConditionalOnMissingBean
public Targeter feignTargeter() {
return new HystrixTargeter();
}
}
HystrixFeignTargeterConfiguration
是Feign为了支持Hystrix而提供的一个配置类,它实现了FeignTargeter
接口,并在target
方法中对目标接口进行了Hystrix的封装。
具体来说,HystrixFeignTargeterConfiguration
在target
方法中创建了一个基于Hystrix的Feign目标接口代理。这个代理类继承了目标接口,并为每个方法都创建了一个HystrixCommand命令。在这些命令中,我们可以为每个方法指定超时时间、熔断器状态和回退逻辑等。
HystrixFeignTargeterConfiguration
默认情况下会为所有使用了@FeignClient
注解的接口启用Hystrix支持。如果你不想启用Hystrix支持,可以在@FeignClient
注解中使用fallback
属性指定一个回退实现类,或者使用@FeignClient
注解的configuration
属性指定一个不包含HystrixFeignTargeterConfiguration
的配置类。
-
new HystrixTargeter()
创建一个
HystrixTargeter
实例。HystrixTargeter
是Feign的目标类选择器的实现之一,它用于为Feign的客户端接口生成具有Hystrix回退功能的代理类。在使用Hystrix作为Feign客户端的回退策略时,可以通过将HystrixTargeter
配置为Feign目标类选择器来启用此功能。
OkHttpFeignConfiguration
OkHttpFeignConfiguration
是Spring Cloud Feign在使用OkHttp作为HTTP客户端的配置类,主要实现了以下三个功能:
- 注册
OkHttpClient
bean,该bean是OkHttp客户端的核心类,用于发送HTTP请求和接收响应。 - 注册
ConnectionPool
bean,该bean用于创建OkHttpFeign的连接池,用于复用TCP连接。在发起HTTP请求时,每次建立TCP连接都需要进行一系列的握手和确认,这个过程比较耗时,而连接池可以复用之前建立好的连接,避免重复建立连接,从而提高HTTP请求的性能和效率。默认情况下,OkHttpClient
的连接池是开启的,且最大连接数为5,空闲连接的最大存活时间为5分钟。 - 注册
Feign.Builder
bean,将OkHttpClient
注入到Feign.Builder
中,使得Feign
能够使用OkHttp
作为HTTP客户端。
@Configuration
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
@ConditionalOnProperty(value = "feign.okhttp.enabled")
protected static class OkHttpFeignConfiguration {
private okhttp3.OkHttpClient okHttpClient;
@Bean
@ConditionalOnMissingBean(ConnectionPool.class)
public ConnectionPool httpClientConnectionPool(FeignHttpClientProperties httpClientProperties,
OkHttpClientConnectionPoolFactory connectionPoolFactory) {
Integer maxTotalConnections = httpClientProperties.getMaxConnections();
Long timeToLive = httpClientProperties.getTimeToLive();
TimeUnit ttlUnit = httpClientProperties.getTimeToLiveUnit();
return connectionPoolFactory.create(maxTotalConnections, timeToLive, ttlUnit);
}
@Bean
public okhttp3.OkHttpClient client(OkHttpClientFactory httpClientFactory,
ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) {
Boolean followRedirects = httpClientProperties.isFollowRedirects();
Integer connectTimeout = httpClientProperties.getConnectionTimeout();
Boolean disableSslValidation = httpClientProperties.isDisableSslValidation();
this.okHttpClient = httpClientFactory.createBuilder(disableSslValidation).
connectTimeout(connectTimeout, TimeUnit.MILLISECONDS).
followRedirects(followRedirects).
connectionPool(connectionPool).build();
return this.okHttpClient;
}
@PreDestroy
public void destroy() {
if(okHttpClient != null) {
okHttpClient.dispatcher().executorService().shutdown();
okHttpClient.connectionPool().evictAll();
}
}
@Bean
@ConditionalOnMissingBean(Client.class)
public Client feignClient() {
return new OkHttpClient(this.okHttpClient);
}
}
-
@ConditionalOnClass(OkHttpClient.class)
表示当类路径下存在
OkHttpClient
类时,才会创建该配置类所定义的Bean。确保在创建Feign.Builder
实例之前,OkHttpClient
类型的Bean已经被创建,这样Feign.Builder
才能够使用OkHttpClient
作为HTTP客户端。 -
@ConditionalOnMissingClass(“com.netflix.loadbalancer.ILoadBalancer”)
表示当类路径下不存在
com.netflix.loadbalancer.ILoadBalancer
类时,才会创建该配置类所定义的Bean。这个注解的作用是,当我们不想使用Netflix Ribbon作为负载均衡器时,就可以排除掉CachingSpringLoadBalancerFactory
的自动配置,从而使用默认的负载均衡策略。 -
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
表示当Spring容器中不存在
OkHttpClient
类型的Bean时,才会创建OkHttpFeignConfiguration
类所定义的Bean。这是因为在OkHttpFeignConfiguration
中的okHttpClient()
方法返回的是OkHttpClient
类型的Bean,所以需要保证该类型的Bean不存在,否则会出现冲突。 -
@ConditionalOnProperty(value = “feign.okhttp.enabled”)
表示当
feign.okhttp.enabled
属性值为true
时,才会创建该配置类所定义的Bean。这个注解的作用是让用户可以通过设置feign.okhttp.enabled
属性来控制是否启用OkHttp
作为Feign
的HTTP客户端。 -
new OkHttpClient(this.okHttpClient)
实际上是创建了一个新的
OkHttpClient
实例,并且使用this.okHttpClient
作为构造函数参数传递进去。由于
OkHttpClient
是线程安全的,因此我们可以共享同一个OkHttpClient
实例来处理多个HTTP请求,这有助于提高应用程序的性能和资源利用率。在这种情况下,我们可以使用OkHttpClient
的newBuilder()
方法创建一个新的OkHttpClient.Builder
实例,然后通过调用builder.build()
方法来创建一个新的OkHttpClient
实例。而在使用Feign时,我们可以将一个预定义的
OkHttpClient
实例作为参数传递给OkHttpClientFeignConfiguration
中的构造函数,并且通过调用new OkHttpClient(this.okHttpClient)
来创建一个新的OkHttpClient
实例。这样做的好处是可以继承预定义的OkHttpClient
的配置信息,避免重复配置。同时,我们也可以根据需要在OkHttpClient
实例的基础上进行自定义配置,以满足特定的需求。
OkHttpClientConnectionPoolFactory
OkHttpClientConnectionPoolFactory
是用于创建OkHttp连接池的工厂类,可以配置连接池的大小、保持连接时间等参数。
默认情况下,OkHttpClientConnectionPoolFactory
使用okhttp3.ConnectionPool
类创建连接池,该类提供了对连接池的基本管理功能。如果需要更高级的功能,可以扩展OkHttpClientConnectionPoolFactory
类并重写createConnectionPool
方法来创建自定义的连接池。
有个默认的实现类DefaultOkHttpClientConnectionPoolFactory
,实现了创建接口。
ConnectionPool
ConnectionPool
是OkHttp中的一个类,用于管理HTTP和HTTPS连接池。HTTP和HTTPS请求在发送请求之前需要建立连接,而建立连接通常需要耗费时间和资源,因此连接池的作用就是重复利用这些已经建立的连接,避免每次请求都需要建立连接,从而提高性能。
在使用OkHttpClient
时,可以通过ConnectionPool
类配置连接池相关的参数,比如最大连接数、空闲连接数等等。OkHttpClient
默认会创建一个连接池,但是如果需要修改连接池的参数,就需要手动创建一个ConnectionPool
对象,并将其传递给OkHttpClient
的构造方法中。
-
在默认情况下,
ConnectionPool
的最大连接数为5,空闲连接的存活时间为5分钟。 -
连接过期处理
private static final Executor executor = new ThreadPoolExecutor(0 /* corePoolSize */, Integer.MAX_VALUE /* maximumPoolSize */, 60L /* keepAliveTime */, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp ConnectionPool", true)); private final Runnable cleanupRunnable = new Runnable() { @Override public void run() { while (true) { long waitNanos = cleanup(System.nanoTime()); if (waitNanos == -1) return; if (waitNanos > 0) { long waitMillis = waitNanos / 1000000L; waitNanos -= (waitMillis * 1000000L); synchronized (ConnectionPool.this) { try { ConnectionPool.this.wait(waitMillis, (int) waitNanos); } catch (InterruptedException ignored) { } } } } } };
定义了一个核心线程数为0,最大线程数为Integer.MAX_VALUE的线程池,用SynchronousQueue承载任务,只要有清理任务进来,线程池马上就可以给任务创建一个线程用于执行,每个池最多只有一个线程在运行,并且线程池执行器允许池本身也被垃圾收集。
-
在类中,用了Deque存储RealConnection,用ArrayDeque()来进行实例化。
Deque是"双端队列"(Double Ended Queue)的缩写,它是一种可以在队列的两端进行插入和删除元素的数据结构。在Java中,Deque是java.util包中的一个接口,它继承自Queue接口,提供了更多的操作方法。
与Queue不同的是,Deque可以在队列的两端插入和删除元素,因此它可以被用作栈、队列和其他数据结构的实现。Deque提供了一系列方法,如addFirst、addLast、removeFirst、removeLast等等,来支持对队列两端的操作。
使用Deque可以实现双端队列、栈、队列等数据结构,具有很高的灵活性和可扩展性。在Java中,Deque的实现类有ArrayDeque和LinkedList,具体使用哪种实现类取决于具体的需求。
常见的应用场景:
- 双端队列:Deque最常见的应用场景就是双端队列,可以在队列的两端进行插入和删除元素,非常适合于需要快速在两端操作的场景,例如事件处理、任务调度等。
- 栈:Deque也可以用作栈,将元素添加到队列的头部并从头部删除元素,这样就可以实现栈的操作,例如函数调用栈等。
- 队列:Deque也可以用作队列,将元素添加到队列的尾部并从头部删除元素,这样就可以实现队列的操作,例如消息队列等。
- 滑动窗口:Deque还可以用于解决滑动窗口问题,例如在一个固定大小的窗口内进行数据处理、统计等操作,Deque可以用来维护窗口内的数据。
-
为什么使用Deque而不是List?
Deque是一个双向队列,可以在队列头和队列尾进行插入和删除操作,因此可以快速找到最新的连接或者空闲的连接。而List只支持从头到尾的遍历,无法直接找到指定的连接。另外,在ConnectionPool中,使用Dqueue存储连接可以保持连接的插入顺序,同时快速找到合适的连接,提高连接的复用率。此外,Dqueue采用链表结构存储,可以动态扩容,不会像普通的List一样因为容量不足而导致性能下降。
-
RealConnection
RealConnection 用于在与服务器建立 Socket 连接时进行一系列的协商,比如 TLS 握手过程、连接池的管理、读写超时的设置等,它维护了一个真正的 TCP/IP 连接,可以进行读写操作。在同一个连接池中,RealConnection 可以被连接重用,减少了连接建立的开销,提高了网络的性能。
-
RouteDatabase
RouteDatabase用于维护客户端到服务器之间的路由信息,包括了Host地址、协议、端口号等信息,可以帮助OkHttp建立不同的连接池。在不同的路由上,可以使用不同的连接池来分别管理它们。通过 RouteDatabase 管理 Route 和 ConnectionPool,可以有效地避免重复创建 TCP/IP 连接,提高网络效率。
具体作用如下:
-
帮助OkHttp找到如果要请求某个url,应该复用哪个Connection连接池中的连接。
-
维护连接池的大小,并在连接数超过最大空闲连接数时可以关闭多余的连接,以防止耗尽服务器资源。
-
根据请求的URL来确定 Route 对象,并从对应的 ConnectionPool 中获取可用的连接,实现对路由的匹配。
-
对于每个 Route,RouteDatabase 存储它所有的(包括空闲和正在使用的) Connections,以方便查找、获取和关闭。
可以看到这里维护了一个黑名单,提高寻找可用连接时的效率。
-
HttpClientFeignConfiguration
HttpClientFeignConfiguration
是Spring Cloud Feign在使用Apache HttpClient作为HTTP客户端的配置类,主要实现了以下三个功能:
- 注册
CloseableHttpClient
bean,该bean是Apache HttpClient客户端的核心类,用于发送HTTP请求和接收响应。 - 注册
HttpClientConnectionManager
bean,该bean是Apache HttpClient中用于管理HTTP连接的接口,它定义了一组方法,用于创建、关闭、连接、管理HTTP连接池等操作。HTTP连接池是Apache HttpClient的一个核心特性,可以显著提高HTTP客户端的性能和吞吐量。 - 注册
Feign.Builder
bean,将ApacheHttpClient
注入到Feign.Builder
中,使得Feign
能够使用ApacheHttpClient
作为HTTP客户端。
该配置类通过@ConditionalOnClass
注解和@ConditionalOnMissingBean
注解,控制了CloseableHttpClient
bean和HttpClientFeign.Builder
bean的创建时机。只有当classpath中存在Apache HttpClient客户端库,并且当前Spring容器中没有已经注册的CloseableHttpClient
bean和HttpClientFeign.Builder
bean时,才会创建这两个bean。
@Configuration
@ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
@ConditionalOnMissingBean(CloseableHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
protected static class HttpClientFeignConfiguration {
private final Timer connectionManagerTimer = new Timer(
"FeignApacheHttpClientConfiguration.connectionManagerTimer", true);
@Autowired(required = false)
private RegistryBuilder registryBuilder;
private CloseableHttpClient httpClient;
@Bean
@ConditionalOnMissingBean(HttpClientConnectionManager.class)
public HttpClientConnectionManager connectionManager(
ApacheHttpClientConnectionManagerFactory connectionManagerFactory,
FeignHttpClientProperties httpClientProperties) {
final HttpClientConnectionManager connectionManager = connectionManagerFactory
.newConnectionManager(httpClientProperties.isDisableSslValidation(), httpClientProperties.getMaxConnections(),
httpClientProperties.getMaxConnectionsPerRoute(),
httpClientProperties.getTimeToLive(),
httpClientProperties.getTimeToLiveUnit(), registryBuilder);
this.connectionManagerTimer.schedule(new TimerTask() {
@Override
public void run() {
connectionManager.closeExpiredConnections();
}
}, 30000, httpClientProperties.getConnectionTimerRepeat());
return connectionManager;
}
@Bean
public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory,
HttpClientConnectionManager httpClientConnectionManager,
FeignHttpClientProperties httpClientProperties) {
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setConnectTimeout(httpClientProperties.getConnectionTimeout())
.setRedirectsEnabled(httpClientProperties.isFollowRedirects())
.build();
this.httpClient = httpClientFactory.createBuilder().
setConnectionManager(httpClientConnectionManager).
setDefaultRequestConfig(defaultRequestConfig).build();
return this.httpClient;
}
@Bean
@ConditionalOnMissingBean(Client.class)
public Client feignClient(HttpClient httpClient) {
return new ApacheHttpClient(httpClient);
}
@PreDestroy
public void destroy() throws Exception {
connectionManagerTimer.cancel();
if(httpClient != null) {
httpClient.close();
}
}
}
-
@ConditionalOnClass(ApacheHttpClient.class)
表示当类路径下存在
ApacheHttpClient
类时,才会创建该配置类所定义的Bean。确保在创建Feign.Builder
实例之前,ApacheHttpClient
类型的Bean已经被创建,这样Feign.Builder
才能够使用ApacheHttpClient
作为HTTP客户端。 -
@ConditionalOnMissingClass(“com.netflix.loadbalancer.ILoadBalancer”)
表示当类路径下不存在
com.netflix.loadbalancer.ILoadBalancer
类时,才会创建该配置类所定义的Bean。这个注解的作用是,当我们不想使用Netflix Ribbon作为负载均衡器时,就可以排除掉CachingSpringLoadBalancerFactory
的自动配置,从而使用默认的负载均衡策略。 -
@ConditionalOnMissingBean(CloseableHttpClient.class)
表示当Spring容器中不存在
CloseableHttpClient
类型的Bean时,才会创建HttpClientFeignConfiguration
类所定义的Bean。这是因为在HttpClientFeignConfiguration
中的httpClient()
方法返回的是CloseableHttpClient
类型的Bean,所以需要保证该类型的Bean不存在,否则会出现冲突。 -
@ConditionalOnProperty(value = “feign.httpclient.enabled”)
表示当
feign.httpclient.enabled
属性值为true
时,才会创建该配置类所定义的Bean。这个注解的作用是让用户可以通过设置feign.httpclient.enabled
属性来控制是否启用OkHttp
作为ApacheHttpClient
的HTTP客户端。 -
new ApacheHttpClient(httpClient)
在
HttpClientFeignConfiguration
中创建一个ApacheHttpClient
实例,该实例包装了一个Apache HttpClient实例httpClient
,用于为Feign客户端提供底层的HTTP通信能力。
关于Feign的配置
在FeignAutoConfiguration
可以看到注册了两个配置文件,分别为FeignClientProperties
和FeignHttpClientProperties
FeignClientProperties
FeignClientProperties
是Spring Cloud Feign客户端配置属性类之一,用于配置Feign客户端的属性。
在Spring Cloud Feign中,使用@FeignClient
注解创建一个Feign客户端接口时,可以在该注解中使用value
属性指定该客户端接口的名称,例如:
@FeignClient(value = "user-service")
public interface UserServiceClient {
// ...
}
在application.properties
或application.yml
配置文件中,可以通过使用feign.client.<client-name>
为前缀的属性来配置指定名称的Feign客户端的属性,例如:
feign.client.user-service.url=http://localhost:8080
feign.client.user-service.connectTimeout=5000
feign.client.user-service.readTimeout=10000
这些配置属性将由FeignClientProperties
类读取和解析,并在Feign客户端接口被创建时传递给相应的Feign客户端实例。这些属性可以配置如Feign客户端接口访问的URL、连接超时时间、读取超时时间等。
通过源码可以看到是用一个HashMap装载了配置。
FeignClientConfiguration
FeignClientConfiguration
是用于自定义Feign客户端的配置类。在Spring Cloud Feign中,每个使用@FeignClient
注解声明的客户端都可以使用该类中定义的配置。
connectTimeout
:连接超时时间readTimeout
:响应超时时间followRedirects
:是否跟随重定向decode404
:当发生http 404错误时,如果配置为true,会调用decoder进行解码,否则抛出FeignExceptionretryer
: 请求失败时的重试策略配置contract
: 定义Feign的接口契约Logger.Level
: Feign的日志级别配置。
FeignHttpClientProperties
FeignHttpClientProperties
是Spring Cloud Feign客户端配置属性类之一,用于配置Feign客户端使用的HTTP客户端的属性。
在Spring Cloud Feign中,使用@EnableFeignClients
注解开启Feign客户端功能后,可以通过在application.properties
或application.yml
配置文件中添加以feign.httpclient
为前缀的配置属性来配置Feign客户端使用的HTTP客户端的属性。例如:
feign.httpclient.enabled=true
feign.httpclient.max-connections=200
默认定义了一些参数,如下图:
-
disableSslValidation:是否开启ssl验证,默认false
-
maxConnections:最大连接数,默认200
-
maxConnectionsPerRoute:最大单个路由连接数,默认50
-
timeToLive:连接存活时间,默认900
-
timeToLiveUnit:连接存活时间单位,默认秒
-
followRedirects:是否跟随重定向,默认true
-
connectionTimeout:连接超时时间,默认2000
-
connectionTimerRepeat:连接定时器重复的时间,默认3000
-
hc5
是Apache HttpClient5附加的参数。