經過JAVA反射修改JDK1.6*當中DNS緩存內容

 

爲了實現性能壓測時的域名動態綁定功能,嘗試經過java反射修改JDK1.6×當中的DNS緩存,感謝在此過程當中林軒同窗的大力幫助。java

網上也存在着修改DNS緩存的方法,可是都是基於jdk1.5的,沒法應用。另外,大部分都是修改的緩存過時時間,而沒有真正去嘗試修改dns 的cache內容,因此嘗試了不少種方法,而且查看了jdk的源代碼,終於實現了修改dns緩存內容和時間,以下,歡迎你們一塊兒探討緩存

修改緩存時間能夠採用修改java security manage文件和增長jvm參數的方法,如下是在代碼中動態修改dns的緩存時間:服務器

public boolean addressCache(Map<String, String> addressMap) {併發

// 如下內容修改緩存失效時間,單位秒(-1,永久緩存;0,不緩存;其它>0的值爲緩存的秒數) 
Class<?> iacp = sun.net.InetAddressCachePolicy.class;dom

Field cachePolicyFiled = null; 
Field setEnable = null; 
try { 
cachePolicyFiled = iacp.getDeclaredField(「cachePolicy」); 
setEnable = iacp.getDeclaredField(「set」); 
} catch (NoSuchFieldException e) { 
logger.error(「Get cachePolicyFiled or setEnable failed!」, e); 

cachePolicyFiled.setAccessible(true); 
setEnable.setAccessible(true);jvm

try { 
cachePolicyFiled.set(null, -1); 
setEnable.set(null, true); 
} catch (IllegalArgumentException e) { 
logger.error(「Set cachePolicyFiled and setEnable failed!」, e); 
} catch (IllegalAccessException e) { 
logger.error(「Access cachePolicyFiled and setEnable failed!」, e); 

// 如下內容修改DNS的緩存數據,實現域名動態綁定 
Class<?> inetAddressClass = java.net.InetAddress.class; 
Field cacheField = null; 
Object addressCache = null; 
InetAddress ia = null; 
try { 
cacheField = inetAddressClass.getDeclaredField(「addressCache」); 
} catch (SecurityException e) { 
logger.error(「Get addressCache security failed!」, e); 
} catch (NoSuchFieldException e) { 
logger.error(「Get addressCache field failed!」, e); 
}高併發

cacheField.setAccessible(true);工具

try { 
addressCache = cacheField.get(inetAddressClass); 
} catch (IllegalArgumentException e) { 
logger.error(「Get cacheField IllegalArgument failed!」, e); 
} catch (IllegalAccessException e) { 
logger.error(「Get cacheField Access failed!」, e); 

Class<?> cacheClazz = addressCache.getClass();性能

Method m_put = cacheClazz.getMethod(「put」, new Class<?>[] { 
String.class, Object.class }); 
m_put.setAccessible(true);測試

try { 
for (String domain : addressMap.keySet()) { 
ia = Inet4Address.getByName(addressMap.get(domain)); 
m_put.invoke(addressCache, new Object[] { domain, 
new InetAddress[] { ia } }); 
}

} catch (IllegalArgumentException e) { 
logger.error(「Put addressCache IllegalArgument failed!」, e); 
} catch (IllegalAccessException e) { 
logger.error(「Put addressCache IllegalAccess failed!」, e); 
} catch (InvocationTargetException e) { 
logger.error(「Put addressCache InvocationTarget failed!」, e); 
} catch (UnknownHostException e) { 
logger.error(「Put addressCache UnknownHost failed!」, e); 

// 修改緩存數據結束 
return true; 
}

在性能壓測時,採用JAVA的DNS緩存有如下好處

1.無需關心dns解析時間,dns解析消耗0毫秒,幾乎無消耗,這樣使得壓測更加關注服務器響應,壓測更充分

2.能夠動態修改DNS緩存,無需修改hosts文件和http連接等不靈活的方式。

3.一個jvm進程能夠對應一套域名綁定,相互之間不影響,能夠實現多場景,多域名綁定的需求壓測。

最後,作一下廣告:歡迎支持淘寶自主研發的高併發集羣性能壓測工具 Trunner ,更多精彩繼續。

雲帥  技術質量部–測試平臺與發展–壓測工具

相關文章
相關標籤/搜索