DnsNameResolverBuilder
方法:
如果DNS服务器返回的DNS资源记录的TTL小于最小TTL或大于最大TTL,则该解析器将忽略从DNS服务器中的TTL,而使用最小TTL或最大TTL。在我的情况下,DNS服务器的TTL设置为5分钟,因此我相信MAXTTL(10秒)应用于缓存DNS结果,但我不观察到。我只注意到,我只在5分钟后仅重试,而不是在10秒后重试的最新IP。 我在这里错过了什么吗?任何帮助都非常感谢。
目前为我的实施,我正在使用
Java11
&
io.netty:netty-all:4.1.100.Final
可能的原因和修复
1。 Netty的TTL行为
方法
ttl(minTtl, maxTtl)
如果在给定范围之外,则应覆盖DNS服务器的TTL。
,但是,如果DNS响应明确设置了5分钟的TTL,Netty仍然可能尊重它而不是使用.dnsCache(NoopDnsCache.INSTANCE) // Disables Netty's internal cache
启动禁用缓存,提供自定义的缓存实现:
.resolveCache(new DefaultDnsCache(5, 10, 10)) // minTTL, maxTTL, negativeTTL
如果涉及CNAME记录,则可能会被不同的缓存。防止CNAME缓存:
.cnameCache(NoopDnsCnameCache.INSTANCE)
System.setProperty("networkaddress.cache.ttl", "10");
System.setProperty("networkaddress.cache.negative.ttl", "10");
确保Java不会缓存DNS响应超过10秒。
端:力DNS刷新
dnsNameResolver.resolveAll(hostname).syncUninterruptibly().getNow();
这种阻止使用陈旧的缓存条目。