如何配置 Java 自己的“新”(Java 9/11/17) HttpClient 以尝试比主机名后面第一个找到的 IP 地址更多的内容?有(至少)两种情况:
> host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::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 客户端实现的一个相当常见的要求。不过,我还不明白如何实现这种行为。
我们有一个 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 有点太晚了。
任何可遵循的帮助/建议/最佳实践,非常感谢。
谢谢