【发布时间】:2015-02-06 08:07:36
【问题描述】:
我想知道是否可以为 java.net.URL 上的 DNS 查找提供自定义实现 - 我的托管服务提供商的 DNS 在一天中的某些时间变得不稳定,然后 DNS 查找失败几分钟,但如果我手动配置我的主机文件中的相关域,它们工作正常,所以我想做的是在软件级别有某种 DNS 缓存,如果 DNS 查找成功,更新缓存,如果失败,回退到缓存的 IP 地址并在该 IP 地址上打开 URLConnection。
这是我的 URL 连接实现:
URL endpoint = new URL(null, url, new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL url)
throws IOException {
URL target = new URL(url.toString());
URLConnection connection = target.openConnection();
// Connection settings
connection.setConnectTimeout(connectionTimeout);
connection.setReadTimeout(readTimeout);
return (connection);
}
});
我在 Oracle 上查看代理,但看不到任何直接在软件级别进行自定义 DNS 查找的方法。
限制:
1:需要在Java6下工作(可能是Java7,但客户端不会很快切换到Java8)
2:无法添加 JVM 参数
3:我不拥有这些端点,因此用 IP 地址替换主机名不是解决方案,因为负载均衡器将根据您来自主机名还是 IP 地址来提供不同的内容/API。例如:mail.google.com 解析为 216.58.223.37,访问该 IP 地址将提供 google.com 内容而不是 mail.google.com 内容,因为这两个服务都位于使用单个 IP 地址的同一负载均衡器后面.
4:我不知道需要缓存多少个 URL 的 DNS 解析,但我知道不会超过 1000 个。理想的解决方案是将 DNS 解析放在静态哈希图中,如果有任何DNS解析成功,更新hashmap,如果失败,使用hashmap中的DNS解析。
5:如果有本地 java 解决方案,我更喜欢使用 JNI - Understanding host name resolution and DNS behavior in Java
【问题讨论】:
-
如果需要更优雅的解决方案,您是否可以简单地将 URL 的主机部分替换为您的自定义 DNS 实现将返回的 IP 地址?我的意思是使用普通的旧字符串操作。
-
我有大约 500 个 URL 需要维护,我希望有一个解决方案,我可以只拥有一个静态哈希图并在内存中查找 90 秒 DNS 不稳定,可能每天一次.
-
@JanVladimirMostert 你解决问题了吗?我的代码无法访问在hackerrank 上运行的AWS。任何 id 如何获取 ip 或更改 dns?
-
我已经发布了我的解决方案。如果没有帮助,请发布一个新的 Stack Overflow 问题,我会看看。
-
在我的情况下不起作用,我无法访问 /etc/hosts,如果您知道任何解决方案,请告诉我