在 Scala Play 中设置 DNS 查找的 TimeToLive

Setting DNS lookup's TimeToLive in Scala Play

我正在尝试在我的 Scala-Play 应用程序中为 DNS 查找设置 TimeToLive 设置。我使用 Play 2.5.9 和 Scala 2.11.8 并遵循 the AWS guide。我尝试了以下方法:

我在应用程序中有以下一段测试代码:

for (i <- 1 to 25) {
  System.out.println(java.net.InetAddress.getByName("google.com").getHostAddress())
  Thread.sleep(1000)
}

这总是打印相同的 IP 地址,例如216.58.212.206。在我看来,上面指定的方法中的 none 似乎有任何效果。但是,也许我正在测试其他东西而不是 TTL 的实际值。因此,我有两个问题:

要通过 java.security.Security 更改 DNS 缓存设置,您必须提供自定义应用程序加载程序。

package modules
class ApplicationLoader extends GuiceApplicationLoader {
  override protected def builder(context: Context): GuiceApplicationBuilder = {
    java.security.Security.setProperty("networkaddress.cache.ttl", "1")
    super.builder(context)
  }
}

构建此应用程序加载器时,您可以在 application.conf

中启用它
play.application.loader = "modules.ApplicationLoader"

之后您可以使用上面的代码并检查 DNS 缓存的行为是否与您设置的一样。但请记住,您的系统正在访问一个缓存自身的 DNS 服务器,因此您不会看到更改。 如果您想确保为 google.com 获得不同的地址,您应该使用像 ns1.google.com

这样的授权名称服务器

如果你想写一个测试,你可以写一个请求地址的测试,然后等待指定的时间直到它再次解析。但是对于像 google.com 这样不受您控制的 DNS 系统,如果您访问具有缓存的 DNS 服务器,这可能是一个问题。 如果你想写这样的支票,你可以用

@RunWith(classOf[JUnitRunner])
class DnsTests extends FlatSpec with Matchers {

  "DNS Cache ttl" should "refresh after 1 second" 
    in new WithApplicationLoader(new modules.ApplicationLoader) {

    // put your test code here

  }
}

如您所见,您可以将自定义应用程序加载器放在测试后面启动的应用程序上下文中。