当前位置: 首页 > news >正文

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

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

相关文章:

  • 开发人员拒绝写技术博客的几个理由
  • 制作网线
  • 基于单决策树的AdaBoost
  • 【SICP练习】53 练习2.21
  • php 基础算法(用*表示金字塔)通过hash 比較两个数组同样的数
  • sass带来的变革
  • QlikView ETL - 分隔字符串的方法 SubField
  • 微软职位内部推荐-Senior Development Lead
  • WSS(Windows Storage Server)2008R2使用指南(二)安装篇
  • javascript——DOM之元素的宽高
  • 【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分
  • SQL Server 2008 R2 安全性专题(一):安全原则
  • the linux command line学习笔记之四
  • PS常见错误-无法完成请求,因为文件格式模块不能解析该文件
  • 多线程中sleep()、wait()方法等的区别
  • @jsonView过滤属性
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【Linux系统编程】快速查找errno错误码信息
  • Docker: 容器互访的三种方式
  • IndexedDB
  • Mybatis初体验
  • Mysql优化
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • vagrant 添加本地 box 安装 laravel homestead
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 力扣(LeetCode)965
  • 如何进阶一名有竞争力的程序员?
  • 微服务核心架构梳理
  • 一个完整Java Web项目背后的密码
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $GOPATH/go.mod exists but should not goland
  • (2020)Java后端开发----(面试题和笔试题)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Python第六天)文件处理
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (论文阅读30/100)Convolutional Pose Machines
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (一)kafka实战——kafka源码编译启动
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (一一四)第九章编程练习
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 依赖注入和配置系统
  • .NET的数据绑定
  • .net快速开发框架源码分享
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET委托:一个关于C#的睡前故事