Ron*_*onK 6 java dns apache-httpclient-4.x
我正在使用 Apache HTTP 客户端 (4.4.x),我希望它检测到我正在使用的 DNS 背后的 IP 已更改。
我做了这个测试代码:
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionTimeToLive(5, TimeUnit.SECONDS)
.build();
for (int i = 0; i < 1_000; i++) {
InetAddress address = InetAddress.getByName("devnull-as-a-service.com");
System.out.println(i + ": HOST header <" + "devnull-as-a-service.com" + "> resolved IP <" + address.getHostAddress() + ">");
CloseableHttpResponse response = httpClient.execute(new HttpGet("https://devnull-as-a-service.com/dev/null"));
System.out.println(response.getStatusLine().getStatusCode() + ": " + response.getEntity());
Thread.sleep(1_000L);
}
Run Code Online (Sandbox Code Playgroud)
在测试期间 - 我更改/etc/hosts并模拟 DNS 更改。
我得到的输出是这样的:
21: HOST header <devnull-as-a-service.com> resolved IP <45.76.95.197>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
22: HOST header <devnull-as-a-service.com> resolved IP <45.76.95.197>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
23: HOST header <devnull-as-a-service.com> resolved IP <45.76.95.197>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
24: HOST header <devnull-as-a-service.com> resolved IP <45.76.95.197>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
25: HOST header <devnull-as-a-service.com> resolved IP <45.76.95.197>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
26: HOST header <devnull-as-a-service.com> resolved IP <45.76.95.197>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
27: HOST header <devnull-as-a-service.com> resolved IP <45.76.95.197>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
28: HOST header <devnull-as-a-service.com> resolved IP <127.0.0.1>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
29: HOST header <devnull-as-a-service.com> resolved IP <127.0.0.1>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
30: HOST header <devnull-as-a-service.com> resolved IP <127.0.0.1>
200: [Content-Type: text/html; charset=UTF-8,Content-Length: 0,Chunked: false]
Run Code Online (Sandbox Code Playgroud)
请注意,DNS 解析在第 28 次迭代中已更改,但服务器仍在响应。
调试 Http 客户端代码时 - 我发现它重用了 中的连接,PoolingHttpClientConnectionManager因为它已经知道路由。
我可以通过让连接池在 5 秒后丢弃连接来缓解这个问题:
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionTimeToLive(5, TimeUnit.SECONDS)
.build();
Run Code Online (Sandbox Code Playgroud)
这似乎解决了问题,在 DNS 更改应用后 5 秒 - 我被路由到正确的主机。
我的问题 - 这是执行此操作的正确方法,还是有更好的方法来检测路由更改,同时仍然长时间重用连接。
| 归档时间: |
|
| 查看次数: |
2106 次 |
| 最近记录: |