HttpClient

public class HttpClientUtils {
    // 只创建HttpClient一个实例
    private static CloseableHttpClient httpClient; 

    static {
           // 客户端端与服务的请求配置
            final RequestConfig requestConfig = RequestConfig.custom()
                    .setSocketTimeout(5 * 1000) // 客户端从服务器读取数据的timeout
                    .setConnectTimeout(5 * 1000) // 指客户端和服务器建立连接的timeout
                    .setConnectionRequestTimeout(10 * 1000) // 指从连接池获取连接的timeout
                    .build();

            // 注册Socket连接的协议Http 和 Https
            final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", SSLConnectionSocketFactory.getSocketFactory()).build();

            // 连接池
            final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
            // 设置连接池的最大连接数增加
            cm.setMaxTotal(200); 
            // 设置每个路由可分配的最大的连接数
            cm.setDefaultMaxPerRoute(30);        
            // 空闲连接空闲时间超过指定时间,连接租借给用户前,尝试读一次服务端(超时1ms)来判断有没有失效, 默认2s
            // keepalive 配置不当,有可能导致The target server failed to respond,
            // 参考:https://czjxy881.github.io//java,nginx/记HttpClient的NoHttpResponse问题/
            cm.setValidateAfterInactivity(2000); 

            // 自定义CloseableHttpClient 实例
            httpClient = HttpClients.custom()
                    // 设置连接池管理器
                    .setConnectionManager(cm)
                    // 禁用cookie, 无状态服务可考虑;注意后端服务容器JSR 340规范,即会开启session,
                    // 默认过期30分钟,禁用cookie,有可能导致服务端内存溢出
                    .disableCookieManagement()
                    // 连接池不是共享模式,这个共享是指与其它httpClient是否共享                  
                    .setConnectionManagerShared(false)    
                    // 定期回收空闲连接, 解决close_wait问题            
                    .evictIdleConnections(10, TimeUnit.SECONDS) 
                    .evictExpiredConnections() // 回收过期连接
                    // 连接存活时间,如果不设置,则根据长连接信息决定
                    .setConnectionTimeToLive(60, TimeUnit.SECONDS) 
                    // 设置默认的请求参数
                    .setDefaultRequestConfig(requestConfig) 
                    .useSystemProperties()  // 设置使用系统参数
                     // 连接重用策略,即是否能keepAlive
                    .setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE) 
                     // 长连接配置,即获取长连接生产多长时间
                    .setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)   
                    // 设置重试次数,默认为3次;非幂等服务不建议开起来
                    .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false)) 
                    .build();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容