通過代碼直接設置Java的DNS - Java Dns Cache Manipulator
通過代碼直接設置Java的DNS(實際上設置的是DNS Cache),支持JDK 6+。
功能
- 設置/重置DNS(不會再去Lookup DNS)
- 可以設置單條
- 或是通過Properties文件批量設置
- 查看DNS Cache內容
- 刪除一條DNS Cache(即重新Lookup DNS)
- 清空DNS Cache(即所有的域名重新Lookup DNS)
需求場景
- 一些庫中寫死了連接域名,需要通過修改host文件綁定才能做測試。結果是:
- 自動持續集成的機器上一般同學是沒有權限去修改host文件的,導致項目不能持續集成。
實際上是因為這點,催生這個庫的需求。 - 單元測試需要每個開發都在開發機上做綁定,增加了依賴的配置操作且繁瑣重復。
- 自動持續集成的機器上一般同學是沒有權限去修改host文件的,導致項目不能持續集成。
- Java的DNS缺省是不會失效的。
如果域名綁定的IP變了,可以通過這個庫重置DNS,作為一個臨時的手段(強烈不推薦)。
當然往往進行要先有能執行入口,比如遠程調用或是jvm-ssh-groovy-shell。
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 API Docs
Java API文檔地址: http://alibaba.github.io/java-dns-cache-manipulator/apidocs
依賴
Maven示例:
<dependency> <groupId>com.alibaba</groupId> <artifactId>dns-cache-manipulator</artifactId> <version>1.0.0</version> </dependency>
可以在search.maven.org查看可用的版本。
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塊,以保證線程安全。
相關資料
- tanhaichao的javahost項目, 該項目的使用文檔。
本項目如何設置Java DNS Cache的解法來自該項目。剛開始在持續集成項目中碰到host綁定的問題時,也是使用該項目來解決的 - 類InetAddress的源代碼:
- JDK 6的InetAddress
- JDK 7的InetAddress
- JDK 8的InetAddress
本文由用戶 n6xb 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!