Java 11/17 HttpClient - 如何尝试一个主机名后面的多个 IP?

问题描述 投票:0回答:1

如何配置 Java 自己的“新”(Java 9/11/17) HttpClient 以尝试比主机名后面第一个找到的 IP 地址更多的内容?有(至少)两种情况:

  1. 支持 IPv4 和 IPv6 的服务器:
> host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
  1. 一个“逻辑”主机名,其中服务由多个冗余服务器提供:
> host frontend.example.com
frontend.example.com has address 245.3.4.5
frontend.example.com has address 246.4.5.6
frontend.example.com has IPv6 address 4f00:5678::19
frontend.example.com has IPv6 address 4f00:7890::20

我的观察是,HttpClient 仅尝试first 传递的地址,如果在该地址下无法访问服务,则会失败。有没有办法告诉它尝试所有分配的IP地址 -

InetAddress.getAllByName()
传送它们 - 直到可以在其中一个找到HTTP服务器,并且如果没有成功,则仅以“无连接”失败。

在第一种情况下,如果某个服务“仅”绑定到 IPv4 或 IPv6 地址,则这是相关的。在第二种情况下,其中一台服务器或服务可能因维护或技术问题而停机,而另一台服务器或服务则服务所有传入请求。因此,在我看来,这应该是 HTTP 客户端实现的一个相当常见的要求。不过,我还不明白如何实现这种行为。

java java-11 java-17 inetaddress java-http-client
1个回答
0
投票

我们有一个 Linux 机器,它具有本地主机 IP 地址(127.XX.XX.XX),后跟 /etc/hosts 文件中列出的内部 IP 地址(192.XXX.XXX.XX)。

服务器应用程序启动时绑定到内部IP地址(192.XXX..)。

我们的客户端应用程序基于Java 17 HttpClient,并且请求是异步发送的

示例代码:

HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://hostname.domain:port/path")) .header("Content-Type", "application/json") .POST(json.body)) .build()

当我们的应用程序在同一个 Linux 机器上运行时,我们发现 HttpClient 库为“hostname.domain”获取第一个 IP 地址(127.XXX.XXX.XX)并抛出 ClosedChannelException。

即使我迭代并获取“hostname.domain”的 IP 地址,如何将“hostname.domain”绑定到该特定 IP 地址,以便在打开套接字通道时它使用我提供的 IP 地址。

我更喜欢使用 Java 的内置库,而且由于我们没有意识到这个缺点,所以切换到 Apache 的 HTTPClient 有点太晚了。

任何可遵循的帮助/建议/最佳实践,非常感谢。

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.