通過代碼直接設置Java的DNS - Java Dns Cache Manipulator

n6xb 9年前發布 | 44K 次閱讀 Java開發 Java Dns Cache Manipulator

通過代碼直接設置Java的DNS - Java Dns Cache Manipulator 通過代碼直接設置Java的DNS(實際上設置的是DNS Cache),支持JDK 6+。

通過代碼直接設置Java的DNS - Java Dns Cache Manipulator 功能

  • 設置/重置DNS(不會再去Lookup DNS)
    • 可以設置單條
    • 或是通過Properties文件批量設置
  • 查看DNS Cache內容
  • 刪除一條DNS Cache(即重新Lookup DNS)
  • 清空DNS Cache(即所有的域名重新Lookup DNS)

通過代碼直接設置Java的DNS - Java Dns Cache Manipulator 需求場景

  1. 一些庫中寫死了連接域名,需要通過修改host文件綁定才能做測試。結果是:
    • 自動持續集成的機器上一般同學是沒有權限去修改host文件的,導致項目不能持續集成。
      實際上是因為這點,催生這個庫的需求。 通過代碼直接設置Java的DNS - Java Dns Cache Manipulator通過代碼直接設置Java的DNS - Java Dns Cache Manipulator
    • 單元測試需要每個開發都在開發機上做綁定,增加了依賴的配置操作且繁瑣重復。
  2. Java的DNS缺省是不會失效的。
    如果域名綁定的IP變了,可以通過這個庫重置DNS,作為一個臨時的手段(強烈不推薦)。
    當然往往進行要先有能執行入口,比如遠程調用或是jvm-ssh-groovy-shell

通過代碼直接設置Java的DNS - Java Dns Cache Manipulator User Guide

通過類DnsCacheManipulator設置DNS。

直接設置
DnsCacheManipulator.setDnsCache("www.hello-world.com", "192.168.10.113");  
// 之后Java代碼中使用到域名都會解析成上面指定的IP。 
// 下面是一個簡單獲取域名對應的IP,演示一下:  
String ip = InetAddress.getByName("www.hello-world.com").getHostAddress(); // ip = "192.168.10.113"

通過dns-cache.properties文件批量配置

在代碼測試中,會期望把域名綁定寫在配置文件。

使用方式如下:

在ClassPath上,提供文件dns-cache.properties:

# 配置格式: # <host> = <ip> www.hello-world.com=192.168.10.113
www.foo.com=192.168.10.2

然后通過下面的一行代碼完成批量設置:

DnsCacheManipulator.loadDnsCacheConfig();

在單元測試中,往往會寫在測試類的setUp方法中,如:

@BeforeClass public void beforeClass() throws Exception {  DnsCacheManipulator.loadDnsCacheConfig();
}

更多詳細功能參見類DnsCacheManipulator的文檔說明。

通過代碼直接設置Java的DNS - Java Dns Cache Manipulator Java API Docs

Java API文檔地址: http://alibaba.github.io/java-dns-cache-manipulator/apidocs

通過代碼直接設置Java的DNS - Java Dns Cache Manipulator 依賴

Maven示例:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dns-cache-manipulator</artifactId>
    <version>1.0.0</version>
</dependency>

可以在search.maven.org查看可用的版本。

通過代碼直接設置Java的DNS - Java Dns Cache Manipulator Developer Guide

如何修改JVM的DNS Cache

JVM的DNS Cache維護在類InetAddress的addressCache私有字段中,通過反射來修改, 具體參見InetAddressCacheUtil

注意修改JVM的DNS Cache的線程安全問題

JVM的DNS Cache顯然是全局共用的,所以修改需要同步以保證沒有并發問題。

通過查看類InetAddress的實現可以確定:通過以addressCache字段為鎖的synchronized塊來保證線程安全。

其中關鍵代碼(JDK 7)如下:

/*  * Cache the given hostname and addresses.  
*/  private static void cacheAddresses(String hostname, InetAddress[] addresses, boolean success) {
    hostname = hostname.toLowerCase();  synchronized (addressCache) {
            cacheInitIfNeeded();  if (success) {
            addressCache.put(hostname, addresses);
        } else {
            negativeCache.put(hostname, addresses);
        }
    }
}

InetAddressCacheUtil類中對DNS Cache的讀寫也一致地加了以addressCache為鎖的synchronized塊,以保證線程安全。

相關資料

項目主頁:http://www.baiduhome.net/lib/view/home/1428376598260

 本文由用戶 n6xb 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!