2016-11-29 17 views
10

Tôi đang cố gắng đặt cài đặt TimeToLive cho Tìm kiếm DNS trong ứng dụng Scala-Play của mình. Tôi sử dụng Play 2.5.9 và Scala 2.11.8 và theo dõi the AWS guide. Tôi đã thử các cách sau:Đặt TimeToLive của tra cứu DNS trong Scala Play

  • trong application.conf

    // Set DNS lookup time-to-live to one minute 
    networkaddress.cache.ttl=1 
    networkaddress.cache.negative.ttl=1 
    
  • trong AppModule hoặc EagerSingleton (mã sẽ tương tự)

    class AppModule() extends AbstractModule { 
        Security.setProperty("networkaddress.cache.ttl", "1") 
        Security.setProperty("networkaddress.cache.negative.ttl", "1") 
        ... 
    } 
    
  • qua biến môi trường:

    sbt -Dsun.net.inetaddr.ttl=1 clean run 
    

Tôi có đoạn mã sau thử nghiệm trong ứng dụng:

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

này luôn in cùng địa chỉ IP, ví dụ 216.58.212.206. Đối với tôi, có vẻ như không có phương pháp nào được nêu ở trên có hiệu lực. Tuy nhiên, có lẽ tôi đang thử nghiệm một cái gì đó khác và không thực sự là giá trị của TTL. Do đó, tôi có hai câu hỏi:

  • cách chính xác để chuyển biến bảo mật vào ứng dụng Play là gì?
  • cách kiểm tra?

Trả lời

7

Để thay đổi cài đặt cho bộ nhớ cache DNS qua java.security.Security, bạn phải cung cấp trình tải ứng dụng tùy chỉnh.

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

Khi bạn xây dựng bộ nạp ứng dụng này bạn có thể kích hoạt nó trong bạn application.conf

play.application.loader = "modules.ApplicationLoader" 

sau đó bạn có thể sử dụng mã của bạn ở trên và kiểm tra xem bộ nhớ cache DNS là hành xử như bạn thiết lập nó. Nhưng hãy nhớ rằng hệ thống của bạn đang truy cập vào một máy chủ DNS đang lưu vào bộ nhớ đệm, do đó bạn sẽ không thấy thay đổi. Nếu bạn muốn đảm bảo rằng bạn nhận được các địa chỉ khác nhau cho google.com, bạn nên sử dụng máy chủ tên ủy quyền như ns1.google.com

Nếu bạn muốn viết một bài kiểm tra để có thể viết bài kiểm tra yêu cầu địa chỉ đợi khoảng thời gian được chỉ định cho đến khi nó lại giải quyết. Nhưng với một hệ thống DNS ngoài tầm kiểm soát của bạn như google.com, điều này có thể là một vấn đề, nếu bạn nhấn một máy chủ DNS với bộ nhớ đệm. Nếu bạn muốn viết một tờ séc đó bạn có thể làm điều đó với

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

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

    // put your test code here 

    } 
} 

Như bạn thấy bạn có thể đặt bộ nạp ứng dụng tùy chỉnh trong bối cảnh của việc áp dụng bắt đầu từ đằng sau thử nghiệm của bạn.

Các vấn đề liên quan