最近项目中需要在微服务中调用rest接口,而且需要调用得次数很多,所以同步得http客户端已经不满足要求,在网上查阅资料后发现了async-http-client这个包得性能不错,所以写了个demo测试性能。

由于在线得网站一般都会限制流量,也有反爬虫,所以为了排除服务端得影响,自己搭建一个简单http服务。代码如下:

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer; import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress; public class HttpServer1 {
private static int index = 0; public static void main(String[] args) {
HttpServer server = null;
try {
server = HttpServer.create(new InetSocketAddress(8001), 0);
} catch (IOException e) {
e.printStackTrace();
}
assert server != null;
server.createContext("/test", new TestHandler());
server.start();
} static class TestHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
index += 1;
System.out.println(index);
String response = "hello world";
exchange.sendResponseHeaders(200, 0);
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
}

这是一个简单得http服务,不会拒绝连接,也不会进行限流。我之前遇到问题就是因为没有在自建得服务上进行测试,而是在其他的微服务上进行测试,而由于微服务往往存在流量限制,所以导致测试得性能不好,我还一直以为是客户端得问题,md。

现在看看客户端代码:

import io.netty.channel.nio.NioEventLoopGroup;
import org.asynchttpclient.*; import java.io.IOException;
import java.util.Date;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; public class AsyncHttp {
public static void main(String[] args) {
DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config()
.setConnectTimeout(5000)
.setRequestTimeout(30000);
AsyncHttpClient client = Dsl.asyncHttpClient(clientBuilder);
NioEventLoopGroup p = new NioEventLoopGroup(8);
System.out.println(new Date().toString());
for (int i = 0; i < 10000; i++) {
BoundRequestBuilder getRequest = client.prepareGet("http://localhost:8001/test");
final ListenableFuture<Response> responseFuture = getRequest.execute();
final int index = i;
Runnable callback = () -> {
try {
Response response = responseFuture.get();
// System.out.println(response);
System.out.println(index);
System.out.println(new Date().toString());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
};
responseFuture.addListener(callback, p);
}
// try {
// client.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
}

很简单地使用asynchttpclient包进行异步的http请求,这里循环异步发送1w条请求,打印时间一共只用了5秒钟,相当于2000条/s,这个效率相比同步http已经高了两个数量级。

这里是我封装的http批量异步请求管理器:

https://github.com/Yves-yuan/batch-async-http-request

欢迎start fork 之类的。

使用async-http-client实现异步批量http请求的更多相关文章

  1. C#异步批量下载文件

    C#异步批量下载文件 实现原理:采用WebClient进行批量下载任务,简单的模拟迅雷下载效果! 废话不多说,先看掩饰效果: 具体实现步骤如下: 1.新建项目:WinBatchDownload 2.先 ...

  2. 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]

    看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...

  3. 使用Async和Await进行异步编程(C#版 适用于VS2015)

    你可以使用异步编程来避免你的应用程序的性能瓶颈并且加强总体的响应.然而,用传统的技术来写异步应用是复杂的,同时编写,调试和维护都很困难. VS2012介绍了简单的方法,那就是异步编程,它在.Net F ...

  4. Async 、 Await 的异步编程(.NET 4.5 新异步模型) [转自MSDN]

    使用异步编程,可以避免性能瓶颈和增强应用程序的总体响应能力. 但是,编写异步应用程序的以前的技术可能比较复杂,使它们难以编写,调试和维护. Visual Studio 2012 引入了一个简化的方法, ...

  5. 使用Async和Await进行异步编程(C#版 适用于VS2015) z

    你可以使用异步编程来避免你的应用程序的性能瓶颈并且加强总体的响应.然而,用传统的技术来写异步应用是复杂的,同时编写,调试和维护都很困难. VS2012介绍了简单的方法,那就是异步编程,它在.Net F ...

  6. 使用 Async 和 Await 的异步编程 #Reprinted#

    异步方法容易编写 string urlContents = await client.GetStringAsync(); 以下特征总结了使上面一个异步方法. 方法签名包含一个 Async 或async ...

  7. Async和Await进行异步编程

    使用Async和Await进行异步编程(C#版 适用于VS2015) 你可以使用异步编程来避免你的应用程序的性能瓶颈并且加强总体的响应.然而,用传统的技术来写异步应用是复杂的,同时编写,调试和维护都很 ...

  8. 【.NET异步编程系列1】:await&async语法糖让异步编程如鱼得水

    前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...

  9. 【C#复习总结】 Async 和 Await 的异步编程

    谈到异步,必然要说下阻塞,在知乎上看到了网友举的例子非常省动,在这里我引用下. 怎样理解阻塞非阻塞与同步异步的区别? 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响 ...

随机推荐

  1. Struts2 利用AJAX 导出大数据设置遮罩层

    Struts2 利用AJAX 导出大数据设置遮罩层 需求背景: 每次我们导出excel的时候 ,如果数据量很大,导出花费的时间会很长,页面却有没人任何反应,这个时候用户会认为系统有问题,要么关了页面, ...

  2. vue - process.env 定义

    1.官方解释:process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程.作为一个对象,它对于 Node.js 应用程序始终是可用的,故无需使用 requir ...

  3. 使用Linux命令行测试网速-----speedtest-cli

    https://github.com/sivel/speedtest-cli 当发现上网速度变慢时,人们通常会先首先测试自己的电脑到网络服务提供商(通常被称为“最后一公里”)的网络连接速度.在可用于测 ...

  4. 趣味编程:CPS风格代码(Java 8,Functional Java版)

    CPS风格代码(Java 8版) package fp; import java.util.function.IntConsumer; public class CPS { static int ad ...

  5. Hibernate的一个问题object references an unsaved transient instance - save the transi5

    1 我做了一对多和多对一的双向关联关系,在User这一方@ManyToOne已经设置了级联Cascade,这样在测试程序中保存User时,Group也应该自动保存,为什么会抛出以下的异常: (我是按着 ...

  6. oracle 基本信息

    查看Oracle是32位还是64位的方法: 方法一:使用sqlplus 64位: [oracle@qs-wg-db2 ~]$ sqlplus / as sysdba;   SQL*Plus: Rele ...

  7. docker 配置远程访问证书验证

    centos7 生成证书 工具:openssl #cd /etc/docker   (docker的证书一般放这) #openssl genrsa -aes256 -passout pass:密码   ...

  8. python json5

    install pip install json5 test a.json: { 'a':'b', 'aa':['b1','b2']} =========================== impo ...

  9. 奶牛易物小组 Alpha冲刺

    项目地址:https://gitee.com/rrycbar/NenuChange 1 第一天 日期:2018/6/14 1.1 今日完成任务情况以及遇到的问题. 吴建瑜: 完成任务: 1.继续完善购 ...

  10. 关于时间查询的sql语句

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...