在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

通过代码直接设置Java的DNS - Java Dns Cache Manipulator

2016-12-13 12:56| 发布者: zhangjf| 查看: 834| 评论: 0

摘要: 通过代码直接设置Java的DNS(实际上设置的是DNS Cache),支持JDK 6+。 功能 设置/重置DNS(不会再去Lookup DNS) 可以设置单条 或是通过Properties文件批量设置 查看DNS Cache内容 删除一条DNS Cache(即 ...

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

通过代码直接设置Java的DNS - Java Dns Cache Manipulator 功能 设置/重置DNS(不会再去Lookup DNS) 可以设置单条 或是通过Properties文件批量设置 查看DNS Cache内容 删除一条DNS Cache(即重新Lookup DNS) 清空DNS Cache(即所有的域名重新Lookup DNS) 通过代码直接设置Java的DNS - Java Dns Cache Manipulator 需求场景 一些库中写死了连接域名,需要通过修改host文件绑定才能做测试。结果是: 自动持续集成的机器上一般同学是没有权限去修改host文件的,导致项目不能持续集成。
实际上是因为这点,催生这个库的需求。 通过代码直接设置Java的DNS - Java Dns Cache Manipulator通过代码直接设置Java的DNS - Java Dns Cache Manipulator 单元测试需要每个开发都在开发机上做绑定,增加了依赖的配置操作且繁琐重复。 Java的DNS缺省是不会失效的。
如果域名绑定的IP变了,可以通过这个库重置DNS,作为一个临时的手段(强烈不推荐)。
当然往往进行要先有能执行入口,比如远程调用或是jvm-ssh-groovy-shell。 通过代码直接设置Java的DNS - Java Dns Cache Manipulator User Guide

通过类DnsCacheManipulator设置DNS。

直接设置
  1. DnsCacheManipulator.setDnsCache("www.hello-world.com", "192.168.10.113");
  2. // 之后java代码中使用到域名都会解析成上面指定的IP。
  3. // 下面是一个简单获取域名对应的IP,演示一下:
  4. String ip = InetAddress.getByName("www.hello-world.com").getHostAddress(); // ip = "192.168.10.113"
复制代码
通过dns-cache.properties文件批量配置

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

使用方式如下:

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

  1. # 配置格式: # <host> = <ip> www.hello-world.com=192.168.10.113
  2. www.foo.com=192.168.10.2
复制代码

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

  1. DnsCacheManipulator.loadDnsCacheConfig();
复制代码

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

  1. @BeforeClass public void beforeClass() throws Exception { DnsCacheManipulator.loadDnsCacheConfig();
  2. }
复制代码

更多详细功能参见类DnsCacheManipulator的文档说明。

通过代码直接设置Java的DNS - Java Dns Cache Manipulator Java API Docs

Java API文档地址: http://alibaba.github.io/java-dns-cache-manipulator/apidocs

通过代码直接设置Java的DNS - Java Dns Cache Manipulator 依赖

Maven示例:

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>dns-cache-manipulator</artifactId>
  4. <version>1.0.0</version>
  5. </dependency>
复制代码

可以在search.maven.org查看可用的版本。

通过代码直接设置Java的DNS - Java Dns Cache Manipulator Developer Guide 如何修改JVM的DNS Cache

JVM的DNS Cache维护在类InetAddress的addressCache私有字段中,通过反射来修改, 具体参见InetAddressCacheUtil。

注意修改JVM的DNS Cache的线程安全问题

JVM的DNS Cache显然是全局共用的,所以修改需要同步以保证没有并发问题。

通过查看类InetAddress的实现可以确定:通过以addressCache字段为锁的synchronized块来保证线程安全。

其中关键代码(JDK 7)如下:

  1. /* * Cache the given hostname and addresses.
  2. */ private static void cacheAddresses(String hostname, InetAddress[] addresses, boolean success) {
  3. hostname = hostname.toLowerCase(); synchronized (addressCache) {
  4. cacheInitIfNeeded(); if (success) {
  5. addressCache.put(hostname, addresses);
  6. } else {
  7. negativeCache.put(hostname, addresses);
  8. }
  9. }
  10. }
复制代码

InetAddressCacheUtil类中对DNS Cache的读写也一致地加了以addressCache为锁的synchronized块,以保证线程安全。

相关资料 tanhaichao的javahost项目, 该项目的使用文档。
本项目如何设置Java DNS Cache的解法来自该项目。刚开始在持续集成项目中碰到host绑定的问题时,也是使用该项目来解决的 通过代码直接设置Java的DNS - Java Dns Cache Manipulator 类InetAddress的源代码: JDK 6的InetAddress JDK 7的InetAddress JDK 8的InetAddress

项目主页:http://www.open-open.com/lib/view/home/1428376598260

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 01:07

Copyright 2015-2025 djqfx

返回顶部