这下我们就能看出每个线程都执行了一次org.apache.http.impl.conn.SystemDefaultDnsResolver#resolve方法,获取到了IP也是随机的,而且每次请求的耗时都是比较长的 。这里让我心生疑惑,相当于每个线程请求都是重新重建了连接,于是就有了下面的测试 。
单个连接这里我把HttpClient的连接池的最大连接数改成了1:public static int MAX_PER_ROUTE_CONNECTION = 1;或者public static int MAX_TOTAL_CONNECTION = 1;,这个之前分享过,这里不多讲了,上用例:
用例同多线程用例
【Java自定义DNS解析器负载均衡实现】控制台输出:
INFO-> 02.928 main###### #### ####### ################## ############################### ########################### #####################################INFO-> 03.648 Deamon 守护线程开启!INFO-> 03.910 F-5/0.0.0.0INFO-> 03.961 F-6请求uri:http://fun.tester:12345/ , 耗时:299 ms , HTTPcode: 200INFO-> 03.961 F-5请求uri:http://fun.tester:12345/ , 耗时:299 ms , HTTPcode: 200INFO-> 03.961 F-4请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200INFO-> 03.961 F-7请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200INFO-> 03.961 F-3请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200INFO-> 03.961 F-2请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200INFO-> 03.961 F-1请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200INFO-> 03.961 F-9请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200INFO-> 03.961 F-8请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200INFO-> 03.961 F-10 请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200WARN-> 04.673 Deamon 异步线程池关闭!
这里看到虽然我起了10个线程分别执行请求,但是每个请求的耗时都是非常长的,但是只有F-5这个线程执行了一次org.apache.http.impl.conn.SystemDefaultDnsResolver#resolve方法,由于HttpClient只有一个连接 。所以应当是每个连接创建的时候会调用org.apache.http.impl.conn.SystemDefaultDnsResolver#resolve方法,而每个线程请求耗时比较高,原因是因为每个线程去获取到链接资源之后,会重新进行建联的过程导致的 。
实践出真知,奇怪的知识又增加了 。
推荐阅读
- 在微控制器平台等小型物联网设备上运行 JavaScript
- Java 字节码技术详解
- DNS是什么意思?DNS怎么设置?
- 域名DNS的作用是什么?
- 使用Ettercap工具进行DNS劫持演示
- Java,OpenCV,图像阈值分割,阈值化,二值阈值化、截断阈值化等
- Java 日志记录—记录什么和不记录什么?
- JAVA计算股票MACD,代码分享
- JAVA实现对阿里云DNS的解析管理
- 国内可用 Win11快速开启DNS加密功能