爲了實現性能壓測時的域名動態綁定功能,嘗試經過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進程能夠對應一套域名綁定,相互之間不影響,能夠實現多場景,多域名綁定的需求壓測。
雲帥 技術質量部–測試平臺與發展–壓測工具