Принуждение Apache HttpClient для обнаружения изменений DNS - PullRequest
2 голосов
/ 06 мая 2020

Я использую Apache HTTP-клиент (4.4.x) и хочу, чтобы он обнаружил, что IP-адрес используемого мной DNS изменился.

Я сделал этот тестовый код:

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-клиента - я вижу, что он повторно использует соединение в PoolingHttpClientConnectionManager, поскольку он уже знает маршрут.

Мне удалось чтобы смягчить эту проблему, заставив пул соединений отбрасывать соединения через 5 секунд:

      CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionTimeToLive(5, TimeUnit.SECONDS)
                .build();

Кажется, это решает проблему, через 5 секунд после применения изменения DNS - я перенаправляюсь на правильный хост.

Мой вопрос - это правильный способ сделать это, или есть лучший способ обнаружения изменений маршрута при повторном использовании соединений в течение длительного времени.

...