文档章节

高性能httpClient

蛋看江湖
 蛋看江湖
发布于 2016/01/02 22:00
字数 782
阅读 100
收藏 0

最近工作中遇到了一个rpc高频调用出现

java.net.BindException: 地址已在使用

问题,由于线下测试的时候并没有庞大的数据量来支撑,这个问题并没有在测试阶段被发现。研究发现,出现改问题的主要是因为短时间内OS的socket被迅速烧光,程序初启动前20秒内一切正常,后面开始狂抛此类异常。之前的http调用主要使用httpclient框架实现,代码如下:

HttpClient httpClient = HttpClient();
GetMethod method = GetMethod();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout();
httpClient.getHttpConnectionManager().getParams().setSoTimeout();
{
    httpClient.executeMethod(method);
} (Throwable t) {
    System..println();
}
String responseBodyAsString = ;
{
    responseBodyAsString = method.getResponseBodyAsString();
    System..println();
} (Throwable t) {
    System..println();
}

该段代码被封装在一个普通的发放内 每次调用传入相应的URL和参数即可。正常情况下并不会出现什么问题。深入分析代码后发现httpclient 对象内部会默认创建一个HttpClientParams对象和SimpleHttpConnectionManager对象 manager 对象内部会持有一个connection 这里可以类比与jdbc 中的connection。非常蛋疼的一点是这个连接在执行完请求后并不会被立即关闭。SimpleHttpConnectionManager对象中有这样一句

alwaysClose = ;

这意味着该连接默认不会被关闭。当然随着方法被执行完,这些对象就成了垃圾数据会被gc掉。但是底层资源的释放速度可就不好说了。恰恰在于上面的那一大段代码处于方法里,在高频调用这个方法时,会创建超多的底层tcp连接。下面的故事就不用多说了。

可能有人会想到既然没关掉这个连接那就想办法关掉就是了 。本人初期也是这么想的 关掉不就行了吗。网上荡了一份代码

HttpClient httpClient = HttpClient(HttpClientParams(),SimpleHttpConnectionManager());

据说这样就可以保证连接会断开(客户端断开),然并卵~~~

继续坑,既然断掉也不行那就复用好吧,翻看源码发现

HttpConnectionManager

这个接口的实现有三个(包含SimpleHttpConnectionManager),其中一个叫做

MultiThreadedHttpConnectionManager

发现了曙光,为多线程准备的ConnectionManager .搞来玩玩。  于是乎就出现了以下的代码

MultiThreadedHttpConnectionManager =MultiThreadedHttpConnectionManager();

{
    .getParams().setMaxTotalConnections();
    .getParams().setDefaultMaxConnectionsPerHost();
}

需要指出的是,这个管理器可以管理多个连接池,底层是一个Map key为host Value 则是connectionPool

setDefaultMaxConnectionsPerHost  就是指每个host允许建立的最多连接数。不需要太多!

结合

new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true));

想到了什么 ?

是的 :

new HttpClient(new HttpClientParams(),cm);

下面的代码原封不动,但是要主要的是获取完数据后记得调用 

method.releaseConnection();

正所谓好借好还,再借不难嘛

这些连接会被管理器揣在兜里需要的时候问他申请,有就给你,没有嘛一边呆着等

个人猜测是借助了http连接的keepAlive 特性。实现多个请求复用一个通道。





注:本文借鉴了多篇该领域的文章,同时结合自身的一些实践心得整理而成

© 著作权归作者所有

共有 人打赏支持
蛋看江湖
粉丝 1
博文 1
码字总数 782
作品 0
普陀
Android 浅谈HttpClient工具类

在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务。你可以把HttpClient想象成一个浏览器,通过它的...

Jonson
2013/07/25
0
3
HttpClient4.x:Get和Post提交数据

HttpClient是一款用Java写的非常好用的基于Http协议的客户端编程工具包。具体举例来讲,用它可以模拟form表单提交数据动作,可以模拟访问网页动作及得到网页源码内容等等,这两点或许是我们在...

liangtee
2012/12/02
0
0
.NET Core 2.1中的HttpClientFactory最佳实践

ASP.NET Core 2.1中出现一个新的HttpClientFactory功能, 它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题。 介绍 在.NETCore平台的2.1新增了...

dotNET跨平台
08/16
0
0
.NetCore 2.1中的HttpClientFactory最佳实践

.NET Core 2.1中的HttpClientFactory最佳实践 ASP.NET Core 2.1中出现一个新的HttpClientFactory功能, 它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一...

Chaunce
08/14
0
0
使用jetty 自带的http client!

一般情况下我们需要使用HttpClient时可供选择的技术有: 1、HttpURLConnection 2、Apache HttpClient 其他的除了写Socket 我都没有用过了。 偶然的机会发现Jetty 里面也自带了一个HttpClien...

一堆BUG
2012/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
22分钟前
0
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部