Я использую 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 - я перенаправляюсь на правильный хост.
Мой вопрос - это правильный способ сделать это, или есть лучший способ обнаружения изменений маршрута при повторном использовании соединений в течение длительного времени.