SpringBoot集成HttpClient

本文介绍了SpringBoot中集成HttpClient的主要步骤和关键概念,包括CloseableHttpClient的使用、RequestConfig的配置、PoolingHttpClientConnectionManager的设定以及ConnetionKeepAliveStrategy的定制。通过配置HTTP 1.1的长连接和HttpClient的线程池,可以有效提高请求效率。同时,文章还提及了如何通过HttpClient来定制RestTemplate。

##HttpClient几个主要概念

  1. CloseableHttpClient
    用于发送请求,因为是线程安全的,所以只需要在程序中创建一个单例。
  2. RequestConfig
    用于配置每个请求的各项timeout等等
  3. PoolingHttpClientConnectionManager
    用于配置连接池
  4. ConnetionKeepAliveStrategy
    用于创建KeepAlive策略。
  5. 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使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值