架构师训练营第 07 周——练习

发布于: 2020 年 07 月 21 日
架构师训练营第 07周——练习

用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
// 请求的URL
String url = "https://www.baidu.com/";
// 并发数量
int curr = 10;
// 单个线程请求数量
int reqCount = 10;
// 保存访问时间
List<Long> times = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(curr);
ThreadPoolExecutor executor = new ThreadPoolExecutor(curr, curr, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1));
try {
for (int i = 0; i < curr; i++) {
executor.execute(() -> {
for (int j = 0; j < reqCount; j++) {
// 记录开始时间
long time = System.currentTimeMillis();
try {
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder(new URI(url)).GET().version(HttpClient.Version.HTTP_1_1).build();
// 发送get请求
client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (URISyntaxException | IOException | InterruptedException e) {
e.printStackTrace();
}
times.add(System.currentTimeMillis() - time);
}
latch.countDown();
});
}
latch.await();
//输出平均响应时间
System.out.println(times.stream().mapToDouble(Double::valueOf).average().orElse(0));
//输出95%响应时间
Collections.sort(times);
System.out.println(times.get((int)Math.ceil(0.95*times.size())));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
}

用户头像

李伟

关注

还未添加个人签名 2018.05.07 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 07周——练习