广告位联系
返回顶部
分享到

三种Java自定义DNS解析器方法与实践

java 来源:互联网 作者:秩名 发布时间:2022-02-23 15:18:09 人浏览
摘要

前言: 最近终于用上了高性能的测试机(54C96G * 3),相较之前的单机性能提升了三倍,数量提升了三倍,更关键的宽带提单机升了30倍不止,总体讲提升了100多倍,这下再也不用担心单

前言:

最近终于用上了高性能的测试机(54C96G * 3),相较之前的单机性能提升了三倍,数量提升了三倍,更关键的宽带提单机升了30倍不止,总体讲提升了100多倍,这下再也不用担心单机压力机瓶颈,直接原地起飞。

不过没高兴5分钟,我发现接口居然请求不通,经过一阵拨乱反正终于找到原因:域名无法解析,IP无法直接访问。

自然而然,解决方案呼之欲出:自定义Java DNS解析器。

经过同事指点、资料搜索和探索实践。终于锁定了两个核心类:org.apache.http.impl.conn.InMemoryDnsResolver和org.apache.http.impl.conn.SystemDefaultDnsResolver,下面我会演示一下这两个类的使用实践,其中主要区别还是在负载均衡的实现上,这个有空再分享。

1.InMemoryDnsResolver

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

    /**

     * 重写Java自定义DNS解析器,非负载均衡

     *

     * @return

     */

    private static DnsResolver getDnsResolver2() {

        InMemoryDnsResolver dnsResolver = new InMemoryDnsResolver();

 

        try {

            dnsResolver.add("fun.tester", InetAddress.getByName("127.0.0.1"));

        } catch (Exception e) {

            e.printStackTrace();

        }

 

        return dnsResolver;

    }

这样我们就可以把fun.tester解析到127.0.0.1上了,后面我会进行一个简单的测试。

2.SystemDefaultDnsResolver

这个看名字是系统默认DNS解析器,但默认在哪,我也没看出来,唯一可以查到的引用就是异步线程池管理器使用

org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager#PoolingNHttpClientConnectionManager(org.apache.http.nio.reactor.ConnectingIOReactor, org.apache.http.nio.conn.NHttpConnectionFactory<org.apache.http.nio.conn.ManagedNHttpClientConnection>, org.apache.http.config.Registry<org.apache.http.nio.conn.SchemeIOSessionStrategy>, org.apache.http.conn.SchemePortResolver, org.apache.http.conn.DnsResolver, long, java.util.concurrent.TimeUnit),

接下来我们看这个Demo

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

  /**

     * 重写Java自定义DNS解析器,负载均衡

     *

     * @return

     */

    private static DnsResolver getDnsResolver() {

        return new SystemDefaultDnsResolver() {

            @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 super.resolve(host);

                }

            }

        };

    }

3.自定义DnsResolver

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

  /**

     * 自定义本地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,非常简单。代码如下:

1

2

3

4

5

6

7

8

  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()

    }

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

1

2

3

4

5

6

7

8

9

10

11

12

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

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.51cto.com/FunTester/4969045
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计