如果我说,写技术文章会上瘾,你信么?当遇到不熟悉的技术,想办法去理解,去总结,并记录下来,它就会变成你的东西。
记得去年时的一个项目,由于对方没有接入SOA服务,只能基于httpclient进行http请求,当时使用HttpClient时,由于缺乏经验,只能照搬别人的参数模板,使用之后才发现这里的坑有多深,也许这些坑大家都可能踩过,今天就总结下使用httpclient的正确姿势,目前用的比较多的版本是3.1和4.2.3。
HttpClient参数说明
当使用HttpClient的项目上线之后,不出问题还好,一旦出了问题就很难排查,但大部分都是由于对参数不了解,随意设置导致的,下面以4.2.3为例,对参数进行说明:
- SO_TIMEOUT "http.socket.timeout"
- 设置从socket套接字中读取数据的等待时间,在规定时间内读取不到数据,则抛出异常,一般设为2 * 1000,如果想深入了解这个参数,可以查看本地方法socketRead0的实现:
private native int socketRead0(FileDescriptor fd, byte b[], int off, int len, int timeout) throws IOException;
- TCP_NODELAY "http.tcp.nodelay"
- 确定是否使用Nagle算法,什么是Nagle算法?
- Nagle算法试图最大限度地减少发送的段数,以节省带宽。
- 当应用希望减少网络延迟,并提高性能,可以禁用Nagle算法,即开启TCP_NODELAY,数据将提前发送,代价是增加带宽。
- SOCKET_BUFFER_SIZE http.socket.buffer-size
- 用来设置接收/发送HTTP消息的内部套接字缓冲区的大小。
- SO_LINGER http.socket.linger
- 以秒为单位设置超时时间,该设置仅影响套接字关闭的情况。
- 0 表示禁用