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——1215七夕节(因数和)
    UVa——400Unix ls(字典序文本处理输出iomanip)
    廖雪峰Java5集合-3Map-Properties的使用
    python图片和字符串的转换
    廖雪峰Java5集合-3Map-1使用Map
    廖雪峰Java5集合-2List-2编写equals方法
    廖雪峰Java5集合-1Java集合简介-1Java结合简介
    廖雪峰Java4反射与泛型-3泛型-7泛型和反射
    廖雪峰Java4反射与泛型-3范型-6super通配符
    廖雪峰Java4反射与泛型-3范型-5extends通配符
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4285234.html
Copyright © 2011-2022 走看看