Java 使用阿里巴巴 Dns Cache Manipulator

405 篇文章 482 订阅 ¥19.90 ¥99.00

1.美图

在这里插入图片描述

2.概述

ava Dns Cache Manipulator(DCM) Library
通过代码直接设置Java的DNS(实际上设置的是DNS Cache),支持JDK 6+,支持IPv6。

3.功能

  1. 设置/重置DNS(不会再去Lookup DNS)

    1. 可以设置单条
    2. 或是通过Properties文件批量设置
  2. 清空DNS Cache(即所有的域名重新Lookup DNS)

  3. 删除一条DNS Cache(即重新Lookup DNS)

  4. 查看DNS Cache内容

  5. 修改/查看JVM缺省的DNS的缓存时间

4.需求场景

  1. 一些库中写死了连接域名,需要通过修改host文件绑定才能做测试。结果是:

    1. 自动持续集成的机器上一般同学是没有权限去修改host文件的,导致项目不能持续集成。
      实际上是因为这点,催生这个库的需求。
    2. 单元测试需要每个开发都在开发机上做host绑定,增加了依赖的配置操作且繁琐重复。
  2. 一些功能需要域名作为输入参数,如使用HTTP请求的网关 或是 有域名检查限制的Web应用。
    这种情况下,让需要让一个域名连接到测试机器的IP上,或是 使用一个还不存在的域名但又不想或不能去配置DNS。

  3. 在性能测试时,

    1. 不去做网络的DNS Lookup(DNS解析消耗),这样使得压测更加关注服务器响应,压测更充分反应出实现代码的性能。

    2. 可以动态修改DNS缓存,无需修改host文件和http链接等不灵活的方式。

    3. 一个JVM进程可以对应一套域名绑定,相互之间不影响,可以实现多场景,多域名绑定的需求压测。

  4. 打开Java中的SecurityManager时(如在Web容器Tomcat中的Web应用),Java的DNS缺省是不会失效的。 如果域名绑定的IP变了,可以通过这个库重置DNS,作为一个临时的手段(强烈不推荐)。

    1. 通过Java Dns Cache Manipulator Tool修改运行中JVM DNS Cache。
      无需应用包含了Java Dns Cache Manipulator Library依赖(即Jar)。

    2. 或通过执行入口调用Java Dns Cache Manipulator Library的方法,比如远程调用或是jvm-ssh-groovy-shell。
      需要应用已经包含了Java Dns Cache Manipulator Library依赖(即Jar)。

5.User Guide

通过类DnsCacheManipulator设置DNS。

引入

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dns-cache-manipulator</artifactId>
    <version>1.6.1</version>
</dependency>

5.1 直接设置

DnsCacheManipulator.setDnsCache("www.hello.com", "192.168.1.1");
DnsCacheManipulator.setDnsCache("www.world.com", "1234:5678:0:0:0:0:0:200e"); 
// 支持IPv6地址 
// 之后Java代码中使用到域名都会解析成上面指定的IP。 
// 下面是一个简单获取域名对应的IP,演示一下: 
String ip = InetAddress.getByName("www.hello.com").getHostAddress(); // ip = "192.168.1.1"
 String ipv6 = InetAddress.getByName("www.world.com").getHostAddress(); // ipv6 = "1234:5678:0:0:0:0:0:200e"
 

5.2 通过dns-cache.properties文件批量配置

在代码测试中,会期望把域名绑定写在配置文件。

使用方式如下:

在ClassPath上,提供文件dns-cache.properties:

# 配置格式: # <host> = <ip> www.hello-world.com=192.168.1.1
www.foo.com=192.168.1.2


然后通过下面的一行代码完成批量设置:

DnsCacheManipulator.loadDnsCacheConfig();


在单元测试中,往往会写在测试类的setUp方法中,如:

@BeforeClass 
public static void beforeClass() throws Exception {
    DnsCacheManipulator.loadDnsCacheConfig();
}

5.3 清空JVM DNS Cache

DnsCacheManipulator.clearDnsCache();

5.4 删除一条DNS Cache

即重新Lookup DNS。

DnsCacheManipulator.removeDnsCache("baidu.com");

5.5 查看JVM DNS Cache

DnsCache dnsCache = DnsCacheManipulator.getWholeDnsCache() 
System.out.println(dnsCache);

5.6 修改/查看JVM缺省的DNS的缓存时间

// 查看缓存时间,单位秒。-1表示永远缓存,0表示不缓存 
int cachePolicy = DnsCacheManipulator.getDnsCachePolicy(); // 设置缓存时间
DnsCacheManipulator.setDnsCachePolicy(2); // 查看未命中条目的缓存时间
DnsCacheManipulator.getDnsNegativeCachePolicy() // 设置未命中条目的缓存时间
DnsCacheManipulator.setDnsNegativeCachePolicy(0);

5.7 使用注意

  1. 域名不区分大小写,域名会统一转成小写,再进入DNS Cache。
    其中一个引发的现象是,DNS查询结果的域名会和输入的域名大小写不同,如果输入的域名有大写字母。

  2. 对于已经完成解析保存了IP的逻辑,修改JVM DNS缓存,不会生效!可以重新创建 连接或Client解决。
    如对于HttpClient:

HttpClient client = new HttpClient();
GetMethod m1 = new GetMethod("http://www.baidu.com");
client.executeMethod(m1); 
String content = m1.getResponseBodyAsString(); // 修改DNS,绑定到自己的机器
DnsCacheManipulator.setDnsCache("www.baidu.com", "192.168.1.1"); // 重新执行m1,仍然是老结果
client.executeMethod(m1);
String content = m1.getResponseBodyAsString(); // 重新创建GetMethod,才能得到自己机器上的结果
GetMethod m2 = new GetMethod("http://www.baidu.com");
client.executeMethod(m2);
content = m2.getResponseBodyAsString();

6.依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dns-cache-manipulator</artifactId>
    <version>1.5.0</version>
</dependency>

参考:https://www.oschina.net/p/java-dns-cache-manipulator

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值