##HttpClient几个主要概念
- CloseableHttpClient
用于发送请求,因为是线程安全的,所以只需要在程序中创建一个单例。 - RequestConfig
用于配置每个请求的各项timeout等等 - PoolingHttpClientConnectionManager
用于配置连接池 - ConnetionKeepAliveStrategy
用于创建KeepAlive策略。 - HTTP 1.1长连接
HTTP 1.1默认支持长连接,在header中会带有keep-alive。
使用HttpClient的线程池,可以利用开启的长连接来减少创建连接的开销。
在整个集成HttpClient的过程中,主要顺序是:
配置KeepAlive策略 -> 配置连接池 -> 配置RequestConfig -> 配置HttpClient
另外也可以通HttpClient来配置自己的RestTemplate
##HttpClient集成
依赖:org.apache.httpcomponents:httpclient:4.5.7
集成配置(Kotlin)
@Configuration
class HttpConfig {
@Primary
@Bean
fun httpClient(requestConfig: RequestConfig, httpClientConnectionManager: HttpClientConnectionManager): CloseableHttpClient {
return HttpClientBuilder
.create()
//.addInterceptorFirst(LogbookHttpRequestInterceptor(OutgoingLogbook.logbook()))
//.addInterceptorFirst(LogbookHttpResponseInterceptor())
.setConnectionManager(httpClientConnectionManager)
.setDefaultRequestConfig(requestConfig)
.setKeepAliveStrategy(KeepAliveStrategy())
.build()
}
@Primary
@Bean
fun sslRestTemplate(httpClient: CloseableHttpClient, objectMapper: ObjectMapper): RestTemplate {
return restTemplateFor(httpClient, objectMapper)
}
private fun restTemplateFor(httpClient: CloseableHttpClient,
objectMapper: ObjectMapper): RestTemplate {
return RestTemplateBuilder()
.requestFactory { BufferingClientHttpRequestFactory(HttpComponentsClientHttpRequestFactory(httpClient)) }
.messageConverters(
MappingJackson2HttpMessageConverter(objectMapper),
ByteArrayHttpMessageConverter(),
StringHttpMessageConverter(),
ResourceHttpMessageConverter()
)
.build()
}
@Bean
fun httpClientConnectionManager(sslContext: SSLContext): HttpClientConnectionManager {
// 此处是关于SSL的配置,如果需要请求https且需要用连接池,需要将该factory配置于此处
val sslConnectionSocketFactory = SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)
val socketFactoryRegistry = RegistryBuilder.create<ConnectionSocketFactory>()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", sslConnectionSocketFactory)
.build()
val connectionManager = PoolingHttpClientConnectionManager(socketFactoryRegistry)
connectionManager.maxTotal = 100
connectionManager.defaultMaxPerRoute = 2
return connectionManager
}
@Bean
fun requestConfig(): RequestConfig {
return RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(1000).setConnectionRequestTimeout(500).build()
}
private class KeepAliveStrategy : ConnectionKeepAliveStrategy {
override fun getKeepAliveDuration(response: HttpResponse, context: HttpContext): Long {
val it = BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE))
while (it.hasNext()) {
val headerElement = it.nextElement()
val param = headerElement.name
val value = headerElement.value
if (value != null && "timeout".equals(param, ignoreCase = true)) {
return value.toLong()
}
}
return 60 * 1000
}
}
}
##HttpClient使用
本文介绍了SpringBoot中集成HttpClient的主要步骤和关键概念,包括CloseableHttpClient的使用、RequestConfig的配置、PoolingHttpClientConnectionManager的设定以及ConnetionKeepAliveStrategy的定制。通过配置HTTP 1.1的长连接和HttpClient的线程池,可以有效提高请求效率。同时,文章还提及了如何通过HttpClient来定制RestTemplate。

5830

被折叠的 条评论
为什么被折叠?



