我想知道是否有可能在java.net.URL上为DNS查找提供自定义实现 - 我的托管服务提供商的DNS在一天的特定时间变得不稳定,然后DNS查找失败几分钟,但如果我手动配置相关域在我的hosts文件中,它们工作正常,所以我想做的是在软件级别有一些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);
}
});
Run Code Online (Sandbox Code Playgroud)
我正在查看Oracle上的代理,但看不到任何直接的方法在软件级别进行自定义DNS查找.
限制:
1:它需要在Java6中工作(可能是Java7,但客户端不会很快切换到Java8)
2:无法添加JVM args
3:我没有这些端点,因此用IP地址替换主机名不是解决方案,因为负载均衡器将根据您是来自主机名还是IP地址来提供不同的内容/ API.例如:mail.google.com解析为216.58.223.37,转到该IP地址将提供google.com内容而不是mail.google.com内容,因为两个服务都使用单个IP地址位于同一负载均衡器后面.
4:我不知道我需要缓存多少URL的DNS解析,但我知道它不会超过1000.理想的解决方案是将DNS解析在静态hashmap中,如果有的话DNS解析成功,更新hashmap,如果失败,则使用hashmap中的DNS解析.
5:如果有本机java解决方案,我宁愿过度使用JNI - 了解Java中的主机名解析和DNS行为
And*_*ner -1
您可以简单地构造另一个 URL:
URL target = new URL(
url.getProtocol(),
customDns.resolve(url.getHost()),
url.getFile());
Run Code Online (Sandbox Code Playgroud)
您可以customDns.resolve(String)使用您需要的任何策略来实施。