java - 强制 Apache HttpClient 检测 DNS 更改
问题描述
我正在使用 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);
}
在测试期间 - 我更改/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]
请注意,DNS 解析在第 28 次迭代中发生了变化,但服务器仍在响应。
在调试 Http Client 代码时 - 我看到它重用了连接,PoolingHttpClientConnectionManager
因为它已经知道路由。
我可以通过让连接池在 5 秒后丢弃连接来缓解这个问题:
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionTimeToLive(5, TimeUnit.SECONDS)
.build();
这似乎解决了问题,在 DNS 更改应用 5 秒后 - 我被路由到正确的主机。
我的问题 - 这是这样做的正确方法,还是有更好的方法来检测路线变化,同时仍然长时间重用连接。
解决方案
推荐阅读
- wix - 如何在 Wix 安装程序中检查和停止卸载?
- android-studio - Could't open Color Adding Window in Android Studio ..!
- selenium - 当我将 $cdc_lasutopfhvcZLmcfl 替换为任何试图避免某些站点通过 chromedriver.exe 检测到的东西时,它不起作用
- php - 使用 PHP 从 Bigquery 获取数据
- ios - Decodable Json, function doesn't run at all?
- python - Pandas fill in missing dates in DataFrame with multiple columns
- javascript - How can I conditionally format my HTML table?
- ios - Mapbox iOS StyleURL 切换导致崩溃
- amazon-web-services - 我应该如何在 API 网关中设置 lambda 函数的集成请求
- angular - 里面的元素