zoukankan      html  css  js  c++  java
  • 通过JAVA反射修改JDK1.6*当中DNS缓存内容

     

    为了实现性能压测时的域名动态绑定功能,尝试通过java反射修改JDK1.6×当中的DNS缓存,感谢在此过程中林轩同学的大力帮助。

    网上也存在着修改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;

    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);

    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 ,更多精彩继续。

    云帅  技术质量部–测试平台与发展–压测工具

  • 相关阅读:
    HDU 2236 无题Ⅱ
    Golden Tiger Claw(二分图)
    HDU 5969 最大的位或 (思维,贪心)
    HDU 3686 Traffic Real Time Query System (图论)
    SCOI 2016 萌萌哒
    Spring Boot支持控制台Banner定制
    构建第一个Spring Boot程序
    Spring Boot重要模块
    Java fastjson JSON和String互相转换
    BCompare 4 Windows激活方法【试用期30天重置】
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4285234.html
Copyright © 2011-2022 走看看