首页 > 解决方案 > 强制 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 秒后 - 我被路由到正确的主机。

我的问题 - 这是这样做的正确方法,还是有更好的方法来检测路线变化,同时仍然长时间重用连接。

标签: javadnsapache-httpclient-4.x

解决方案


推荐阅读