gpt4 book ai didi

java - 如何让 Java 遵守 DNS 缓存超时?

转载 作者:IT老高 更新时间:2023-10-28 11:36:43 31 4
gpt4 key购买 nike

我们使用 GSLB 进行地理分布和负载平衡。每个服务都分配了一个固定的域名。通过一些 DNS 魔术,域名被解析为最接近负载最少的服务器的 IP。为了使负载均衡发挥作用,应用服务器需要遵守来自 DNS 响应的 TTL,并在缓存超时时重新解析域名。但是,我想不出在 Java 中执行此操作的方法。

应用程序采用 Java 5,在 Linux (Centos 5) 上运行。

最佳答案

根据 Byron 的回答,您不能使用 -D 将 networkaddress.cache.ttlnetworkaddress.cache.negative.ttl 设置为系统属性 标志或调用 System.setProperty 因为这些不是系统属性 - 它们是 Security 属性。

如果您想使用系统属性来触发此行为(因此您可以使用 -D 标志或调用 System.setProperty),您需要设置以下系统属性:

-Dsun.net.inetaddr.ttl=0

此系统属性将启用所需的效果。

但请注意:如果您在启动 JVM 进程时不使用 -D 标志并选择从代码中调用它:

java.security.Security.setProperty("networkaddress.cache.ttl" , "0")

此代码必须在 JVM 中的任何其他代码尝试执行网络操作之前​​执行。

这很重要,因为例如,如果您在 .war 文件中调用 Security.setProperty 并将该 .war 部署到 Tomcat,这将不起作用:Tomcat 使用 Java 网络堆栈比你的 .war 的代码执行更早地初始化自己。由于这种“竞争条件”,在启动 JVM 进程时使用 -D 标志通常更方便。

如果您不使用-Dsun.net.inetaddr.ttl=0 或调用Security.setProperty,则需要编辑$JRE_HOME/lib/security/java.security 并在该文件中设置这些安全属性,例如

networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0

但请注意围绕这些属性的评论中的安全警告。仅当您有理由确信自己不会受到 DNS spoofing attacks 的影响时才这样做。 .

关于java - 如何让 Java 遵守 DNS 缓存超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1256556/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com