Настройка поиска DNS TimeToLive в Scala Воспроизвести

Я пытаюсь установить параметр TimeToLive для поиска DNS в моем приложении Scala -Play. Я использую Play 2.5.9 и Scala 2.11.8 и следую руководству AWS. Я пробовал следующие способы:

  • в 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?
  • как проверить его?

Ответ 1

Чтобы изменить настройки кеша DNS через java.security.Security вы должны предоставить специальный загрузчик приложений.

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

Если вы хотите написать тест для этого, вы можете написать тест, который запрашивает адрес, а затем ожидает указанное количество времени, пока он не разрешится снова. Но с системой DNS, находящейся вне вашего контроля, такой как google.com, это может стать проблемой, если вы попадете на 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

  }
}

Как вы можете видеть, вы можете поместить пользовательский загрузчик приложения в контекст приложения, запускаемого за тестом.