httpclient3.x工具包设计

本文介绍了一款基于httpclient3.1开发的HTTP客户端工具包,该工具包针对HTTP请求进行了封装,支持连接池管理、多种请求方式等功能,旨在提高系统的并发处理能力和减少TCP连接的频繁创建。

概述

http客户端调用工具包,基于httpclient3.1(org.apache.commons.httpclient)开发,针对http请求相关业务需求进行封装。
包含功能

  • 1、http连接池
  • 2、提供form表单和body两种方式请求

名称说明

http连接池

在七层网络协议中,http协议属于应用层协议,主要聚焦在规范数据层面,定义报文规则,使接收方能正确解析和响应,而在应用层下面的传输层,主要聚焦数据传输层面,包括tcp、ftp协议。http请求(连接)最终必须绑定到一个tcp连接进行上下行传输。传统http请求流程,为收到http请求,封装http报文,建立tcp连接,传输数据,收到响应,断开tcp连接,请求完成,每次请求都要新建一个tcp连接。httpclient建立的连接池是传输层tcp连接。接收到http后,包装http报文,在发送时,从连接池中获取一个tcp连接进行传输,传输完毕后不关闭tcp连接,而是归还给连接池,由连接池维护tcp连接的生命周期,从而实现tcp连接的复用,减少系统和服务端频繁建立tcp连接的消耗,在高并发时这个损耗比较大。另一方面,在高并发时,通过连接池可以有效的减少并发tcp连接数,减少客户端服务监听端口消耗,监听端口数量是有限,从而提高系统吞吐量,用少量tcp连接处理大量http请求,增加处理性能。最后,对于服务端,并发的tcp连接减少了,减少了服务端处理并发峰值压力,增加服务端稳定性。

工具类说明

HttpClientTools(主调工具类)

工具类中封装了httpClient发送请求的静态方法

HttpClientConfig(httpClient配置类)

配置http请求中的字符集、Header等信息的配置

HttpClientPool(httpClient连接池)

此类中提供了,设置连接池属性的静态方法,不配置则用默认配置。 采用单例模式,提供了HttpClient的初始化

HttpClientPoolConfig(httpClient链接池参数配置)

连接池、httpClient的基础配置,涵盖最大连接数、连接超时配置、响应超时配置等基础配置

HttpReq(http请求对象)

http请求的参数对象,涵盖请求地址、请求参数、字符集等属性

HttpResp(http响应对象)

http响应的参数对象,涵盖响应状态、标题头、响应内容(byte)等信息

配置属性

ConnectionTimeout

建立连接超时时间,创建tcp连接的超时时间。调小这个值,可以有效减少异常请求地址对连接的占用,将连接留给质量好的请求。

SocketTimeout

响应超时时间,两次响应之间间隔时间,对于一般请求只有一次响应,为服务端响应超时时间,对处理时间较长的接口,需要调整此值。调小此连接也可以提高响应速度,增加系统吞吐,会增加异常请求概率,如有需要,需使用重发机制,此时服务端要考虑幂等处理。

ConnectionManagerTimeout

从连接池中获取连接的超时时间,即等待ConnectionManager释放connection的时间。在高并发情况下,连接池会不断创建新的连接,直到达到连接池最大连接数,此时连接池中已无空闲连接情况下,新的获取连接请求会处于等待状态,这个参数就是设置等待超时时间。调小这个时间,可以有效的提高响应速度并降低积压请求量,但是会增加请求失败概率。

idleConnTimeout

空闲连接超时时间。设置了该值,超时的链接将在下一次空闲链接检查时被销毁

PoolMaxTotal

连接池最大总连接数。

MaxPerRoute

连接池最大路由连接数,一个主机和端口组成一个路由,针对此路由设置的最大连接数。主要限制每个路由连接数,不会出现某个路由占用整个连接池连接数,导致其他路由生成不了连接情况。这个可以根据具体情况设置,如果已知同意时刻只有一个路由存在时,可以将路由连接数等于最大连接数。

使用方式

http工具类使用

//http调用.sendPost方式,还有其他方式同理(使用当前系统中设置的配置)
String url = "http://testbs.ggjfw.com/channel-gateway/inner/method/testTimeOut.do";
Map<String, String> map = new HashMap<String, String>();
map.put("timeout", "10000");
System.out.println("准备发请求:"+getNowDateTime());
try {
    HttpResp httpResp = HttpClientTools.sendPost(url, map);
    System.out.println("收到响应:"+getNowDateTime());
    if (httpResp != null && httpResp.isSuccess()){
        System.out.println(getNowDateTime());
        System.out.println("成功了");
    }else{
        System.out.println(getNowDateTime());
        System.out.println("失败了");
    }
} catch (HttpCommonException e) {
    System.out.println(e.getCode()+"-"+e.getMsg());
}

初始化连接池方式

//连接池配置,项目启动时初始化一次即可。如不设置否则使用默认配置。
HttpClientPoolConfig httpClientPoolConfig = new HttpClientPoolConfig();
httpClientPoolConfig.setConnectionTimeout(20000);//获取连接超时时间(毫秒)
httpClientPoolConfig.setSocketTimeout(5000);//响应超时时间(毫秒)
httpClientPoolConfig.setConnectionManagerTimeout(60000);//等待ConnectionManager释放connection的时间 毫秒
httpClientPoolConfig.setIdleConnTimeout(60000);//闲置连接超时时间 毫秒
httpClientPoolConfig.setPoolMaxTotal(100);//连接池大小
httpClientPoolConfig.setMaxPerRoute(50);//每个路由最大值
HttpClientPool.init(httpClientPoolConfig);

重载更新连接池配置

//重载连接池配置(改变系统中的配置)
HttpClientPoolConfig httpClientPoolConfig = new HttpClientPoolConfig();
httpClientPoolConfig.setConnectionTimeout(20000);//获取连接超时时间(毫秒)
httpClientPoolConfig.setSocketTimeout(5000);//响应超时时间(毫秒)
httpClientPoolConfig.setConnectionManagerTimeout(60000);//等待ConnectionManager释放connection的时间 毫秒
httpClientPoolConfig.setIdleConnTimeout(60000);//闲置连接超时时间 毫秒
httpClientPoolConfig.setPoolMaxTotal(100);//连接池大小
httpClientPoolConfig.setMaxPerRoute(50);//每个路由最大值
HttpClientPool.reload(httpClientPoolConfig);

获取httpClient

//工具类默认方法中使用的方式
//获取默认的httpClient(使用当前系统中设置的配置)
HttpClientPool.getHttpClient();

获取httpClient并更新连接池配置

//默认方法中不使用该方式
//获取新配置的httpClient(改变系统中的配置)
HttpClientPoolConfig httpClientPoolConfig = new HttpClientPoolConfig();
httpClientPoolConfig.setConnectionTimeout(20000);//获取连接超时时间(毫秒)
httpClientPoolConfig.setSocketTimeout(5000);//响应超时时间(毫秒)
httpClientPoolConfig.setConnectionManagerTimeout(60000);//等待ConnectionManager释放connection的时间 毫秒
httpClientPoolConfig.setIdleConnTimeout(60000);//闲置连接超时时间 毫秒
httpClientPoolConfig.setPoolMaxTotal(100);//连接池大小
httpClientPoolConfig.setMaxPerRoute(50);//每个路由最大值
HttpClientPool.getHttpClient(httpClientPoolConfig);

结论要点

访问重试

访问域名时,cdn 10秒会掐断一次,导致自动重发请求3次,每一次间隔为10s,当第3次失败时抛Connection reset,若第1、2次失败则抛read time out。所以如果是访问域名时,响应超时时间最好要设置在10秒内。
访问ip时,则不会掐断重试,失败时抛read time out

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值