java httpclient 单例_HttpClient实战二:单线程和多线程连接池实例

随着系统架构风格逐渐向前后端分离架构,微服务架构转变,RestFul风格API的开发与设计,同时SpringMVC也很好的支持了REST风格接口。各个系统之间服务的调用大多采用HTTP+JSON或HTTPS+JSON方式。HTTP1.1默认是持久连接,HTTP1.0也可以通过在请求头中设置Connection:keep-alive使得连接成为长连接。既然HTTP协议支持长连接,那么HTTP连接同样可以使用连接池技术来管理和维护连接建立和销毁。 但是由于每次HTTP连接请求实际上都是在传输层建立的TCP连接,利用的socket进行通信,HTTP连接的保持和关闭实际上都同TCP连接的建立和关闭有关,所有每次HTTP请求都有经过TCP连接的三次握手(建立连接)和四次挥手(释放连接)的过程。所以采用HTTP连接池有以下优势:

降低了频繁建立HTTP连接的时间开销,减少了TCP连接建立和释放时socket通信服务器端资源的浪费;

支持更高的并发量;

常用HttpClient连接池API

本文使用的是目前最新版本的HttpClient4.5.3,所以下文的内容都是基于该版本书写。

PoolingHttpClientConnectionManager连接池管理实现类PoolingHttpClientConnectionManager是一个HttpClient连接池实现类,实现了HttpClientConnectionManager和ConnPoolControl接口。类层次结构如下图所示:

java httpclient 单例_HttpClient实战二:单线程和多线程连接池实例_第1张图片

PoolingHttpClientConnectionManager类层次结构

构造方法:PoolingHttpClientConnectionManager():无参构造方法,从源码中可以看到该方法调用了getDefaultRegistry()来注册http协议和https协议。常用方法:public void setMaxTotal(int max):该方法定义在ConnPoolControl接口中,表示设置最大连接数为max。public void setDefaultMaxPerRoute(int max):该方法也是定义在ConnPoolControl接口中,表示将每个路由的默认最大连接数设置为maxpublic void setMaxPerRoute(HttpRoute route,int max):设置某个指定路由的最大连接数,这个配置会覆盖setDefaultMaxPerRoute的某个路由的值。

RequestConfig请求参数配置类

java httpclient 单例_HttpClient实战二:单线程和多线程连接池实例_第2张图片

RequestConfig方法与内部类Builder

常用方法static RequestConfig.Builder custom():静态方法,用于构建Builder 对象,然后设置相应的参数;int getConnectionRequestTimeout():获取从连接池获取连接的最长时间,单位是毫秒;int getConnectTimeout():获取创建连接的最长时间,单位是毫秒;int getSocketTimeout():获取数据传输的最长时间,单位是毫秒;

RequestConfig有一个静态内部类Builder,用于构建RequestConfig对象并设置请求参数,该类有以下常用方法:public RequestConfig.Builder setConnectionRequestTimeout(int connectionRequestTimeout):设置从连接池获取连接的最长时间,单位是毫秒;public RequestConfig.Builder setConnectTimeout(int connectTimeout):设置创建连接的最长时间,单位是毫秒;public RequestConfig.Builder setSocketTimeout(int socketTimeout):设置数据传输的最长时间,单位是毫秒;

HttpRequestRetryHandler请求重试接口boolean retryRequest(IOException exception, int executionCount, org.apache.http.protocol.HttpContext context):实现该接口的,必须实现该方法,决定了如果一个方法执行时发生了IO异常,是否应该重试,重试executionCount次。

单线程-使用连接池管理HTTP请求

主要步骤:

创建HTTP的连接池管理对象cm,如下所示

PoolingHttpClientConnectio

你可能感兴趣的:(java,httpclient,单例)