文档章节

高性能httpClient

蛋看江湖
 蛋看江湖
发布于 2016/01/02 22:00
字数 782
阅读 79
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

002,zabbix-agent的安装 监控Linux主机

2.1.安装zabbix-agent $ rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm$ yum install -y zabbix-agent zabbix-get 2.2.配置zabbix-agent ......

happyeveryday32
37分钟前
2
0
docker learn :swarm

swarm是什么 swarm是一组运行docker服务的集群,之后,还是使用那些命令去操作docker,但是是通过swarm manager来执行的。 swarm中的机器可以是实体的也可以是虚拟的,加入swarm后,他们被当作...

writeademo
37分钟前
1
0
Golang + vscode 开发环境配置

GOPATH 环境变量的配置 https://my.oschina.net/xinxingegeya/blog/718305 安装vscode go 扩展 下载vscode ,安装go的扩展https://github.com/Microsoft/vscode-go 该扩展对 Golang 支持非常......

秋风醉了
40分钟前
0
0
idea jar包

我自己用idea新建一个springboot项目,打包一直有问题,百度了下,又总结了下。 方式一: 找到Project Structure菜单,然后点开,照下图点击 然后出现下图所示 红框1:为你项目的main函数所在...

朝如青丝暮成雪
41分钟前
0
0
Vue scoped CSS 与深度作用选择器 /deep/

使用 scoped 后,父组件的样式将不会渗透到子组件中。 例如(无效): <template> <div id="app"> <el-input class="text-box" v-model="text"></el-input> </div></template><......

不负好时光
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部