自建dns解析,指定dns解析

  自建dns解析,指定dns解析

  00-1010 1.inmemorydnresolver 2。系统默认dnsresolver 3。自定义DnsResolver4。连接池管理器5。测试前言:

  最近用的是高性能试验机(54C96G * 3)。与之前的单机相比,性能提升了3倍,数量增加了3倍。比较关键的宽带提升器增长了30多倍,一般情况下增长了100多倍。现在,你再也不用担心单机压线的瓶颈,直接原地起飞。

  但是5分钟没觉得开心,发现界面请求不了了。过了一段时间,终于找到了原因:域名无法解析,IP无法直接访问。

  自然而然,解决方案就出来了:定制Java DNS解析器。

  经过同事的指点,资料查找和探索实践。最后锁定了两个核心类:org . Apache . http . impl . conn . inmemorydnresolver和org . Apache . http . impl . conn . systemdefaultdnsresolver,下面我将演示这两个类的使用实践,主要区别是负载均衡的实现。有时间我会分享这个。

  00-1010这个类使用起来比较简单。先写一个Demo,实现一个简单的域名解析。

  /* * *重写Java自定义DNS解析器,非负载平衡* * @ return */private静态DNS解析器getdnsresolver 2(){ inmemorydnresolver DNS resolver=newinmemorydnresolver();尝试{ dnsResolver.add(fun.tester ,inet address . get by name( 127 . 0 . 0 . 1 );} catch(Exception e){ e . printstacktrace();}返回dnsResolver}这样我们就可以把fun.tester解析到127.0.0.1。稍后我会进行一个简单的测试。

  00-1010的名称是系统默认的DNS解析器,但我看不出默认在哪里。唯一可以找到的参考是使用异步线程池管理器。

  org . Apache . http . impl . nio . conn . PoolingNHttpClientConnectionManager # PoolingNHttpClientConnectionManager(org . Apache . http . nio . reactor . connecting ioreator,org . Apache . http . nio . conn . nhttpconnectionfactoryorg . Apache . http . nio . conn . managednhttpclientconnection,org . Apache . http . config . registry org . Apache . http . nio . conn . schemeosisession

  接下来,我们来看这个演示

  /* * *覆盖Java自定义DNS解析器,负载平衡* * @ return */private静态DNS解析器getdns resolver(){ return new system default DNS resolver(){ @ Override public inet address[]resolve(final String host)抛出unknown hostexception { if(host . equalsignorecase( fun . tester ){ return new inet address[]{ inet address . get byname( 127 . 0 . 0 . 1 )};} else { return super . resolve(host);} } }

  ;    }

 

  

3.自定义DnsResolver

通过源码可以看出,两个实现类都是通过实现org.apache.http.conn.DnsResolver这个接口中org.apache.http.conn.DnsResolver#resolve方法。我们自己可以完全自己实现。

 

  

  /**     * 自定义本地DNS解析器实现     *     * @return     */    private static DnsResolver getDnsResolver3() {        return new DnsResolver() {            @Override            public InetAddress[] resolve(final String host) throws UnknownHostException {                if (host.equalsIgnoreCase("fun.tester")) {                    return new InetAddress[]{InetAddress.getByName("127.0.0.1")};                } else {                    return InetAddress.getAllByName(host);                }            }        };    }

仔细看不难发现,其实就是代码缝合怪。

 

  

 

  

4.连接池管理器

下面分享一下如何使用自定义的org.apache.http.conn.DnsResolver,就是在创建连接池管理器的时候设置一下就可以。

 

  

 

  

5.测试

首先我在本地起一个HTTP服务,端口12345,非常简单。代码如下:

 

  

   static void main(String[] args) {        def util = new ArgsUtil(args)        def server = getServerNoLog(util.getIntOrdefault(0, 12345))        server.response("Have Fun ~ Tester !")        def run = run(server)        waitForKey("fan")        run.stop()    }

然后我准备一个测试脚本:

 

  

  public static void main(String[] args) {        String url = "http://fun.tester:12345/"        def get = getHttpGet(url)        def funtester = {            fun {                getHttpResponse(get)            }        }        10.times {            funtester()        }    }

控制台日志输出:

 

  

INFO-> 27.214 F-1 请求uri:http://fun.tester:12345/ , 耗时:304 ms , HTTPcode: 200INFO-> 27.214 F-4 请求uri:http://fun.tester:12345/ , 耗时:304 ms , HTTPcode: 200INFO-> 27.214 F-10 请求uri:http://fun.tester:12345/ , 耗时:305 ms , HTTPcode: 200INFO-> 27.214 F-5 请求uri:http://fun.tester:12345/ , 耗时:305 ms , HTTPcode: 200INFO-> 27.214 F-2 请求uri:http://fun.tester:12345/ , 耗时:305 ms , HTTPcode: 200INFO-> 27.214 F-8 请求uri:http://fun.tester:12345/ , 耗时:305 ms , HTTPcode: 200INFO-> 27.214 F-3 请求uri:http://fun.tester:12345/ , 耗时:305 ms , HTTPcode: 200INFO-> 27.214 F-7 请求uri:http://fun.tester:12345/ , 耗时:305 ms , HTTPcode: 200INFO-> 27.214 F-6 请求uri:http://fun.tester:12345/ , 耗时:305 ms , HTTPcode: 200INFO-> 27.214 F-9 请求uri:http://fun.tester:12345/ , 耗时:305 ms , HTTPcode: 200

 

  

三种实现方式控制台输出大同小异,都能满足我们的需求,当然仅仅是功能测试场景下。下期会结合源码分析如何实现负载均衡。

 

  到此这篇关于三种Java自定义DNS解析器方法与实践的文章就介绍到这了,更多相关Java自定义DNS解析器内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: