在 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。我尝试了以下方法:
在application.conf
// Set DNS lookup time-to-live to one minute
networkaddress.cache.ttl=1
networkaddress.cache.negative.ttl=1
在 AppModule 或 EagerSingleton 中(代码会类似)
class AppModule() extends AbstractModule {
Security.setProperty("networkaddress.cache.ttl", "1")
Security.setProperty("networkaddress.cache.negative.ttl", "1")
...
}
作为环境变量传递:
sbt -Dsun.net.inetaddr.ttl=1 clean run
我在应用程序中有以下一段测试代码:
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 的实际值。因此,我有两个问题:
- 将安全变量传递到 Play 应用程序的正确方法是什么?
- 如何测试?
要通过 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
}
}
如您所见,您可以将自定义应用程序加载器放在测试后面启动的应用程序上下文中。
我正在尝试在我的 Scala-Play 应用程序中为 DNS 查找设置 TimeToLive 设置。我使用 Play 2.5.9 和 Scala 2.11.8 并遵循 the AWS guide。我尝试了以下方法:
在application.conf
// Set DNS lookup time-to-live to one minute networkaddress.cache.ttl=1 networkaddress.cache.negative.ttl=1
在 AppModule 或 EagerSingleton 中(代码会类似)
class AppModule() extends AbstractModule { Security.setProperty("networkaddress.cache.ttl", "1") Security.setProperty("networkaddress.cache.negative.ttl", "1") ... }
作为环境变量传递:
sbt -Dsun.net.inetaddr.ttl=1 clean run
我在应用程序中有以下一段测试代码:
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 的实际值。因此,我有两个问题:
- 将安全变量传递到 Play 应用程序的正确方法是什么?
- 如何测试?
要通过 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
}
}
如您所见,您可以将自定义应用程序加载器放在测试后面启动的应用程序上下文中。