【问题标题】:Setting DNS lookup's TimeToLive in Scala Play在 Scala Play 中设置 DNS 查找时间
【发布时间】:2016-11-29 20:17:15
【问题描述】:

我正在尝试在我的 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。对我来说,上面指定的方法似乎都没有任何效果。但是,也许我正在测试其他东西,而不是实际的 TTL 值。因此,我有两个问题:

  • 将安全变量传递到 Play 应用程序的正确方法是什么?
  • 如何测试?

【问题讨论】:

    标签: scala playframework dns ttl


    【解决方案1】:

    要通过 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
    
      }
    }
    

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

    【讨论】:

    • 我可以验证这是否有效,但如果没有活动的SecurityManager(根据配置,自定义的也可能有效,但我尚未对此进行测试)。如果启用了默认的SecurityManager,那么,根据我公认的有限经验,您唯一的选择是在相关的java.security 文件中定义networkaddress.cache.ttl=&lt;your-value&gt;,或者通过JVM 选项进行安全文件覆盖。
    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多