我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java如何自定义DNS解析器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java如何自定义DNS解析器

本篇内容介绍了“Java如何自定义DNS解析器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言:

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

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

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

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

1.InMemoryDnsResolver

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

        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

       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方法。我们自己可以完全自己实现。

      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: 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

“Java如何自定义DNS解析器”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java如何自定义DNS解析器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java如何自定义DNS解析器

本篇内容介绍了“Java如何自定义DNS解析器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言:最近终于用上了高性能的测试机(54C96G
2023-06-29

云原生Docker容器自定义DNS解析

Docker没有为每个容器专门定制镜像,那么怎么自定义配置容器的DNS配置呢?这篇文章主要给大家介绍了关于云原生Docker容器自定义DNS的相关资料,需要的朋友可以参考下
2023-02-21

自定义dns服务器如何设置

要设置自定义DNS服务器,您需要完成以下步骤:1. 选择一个合适的DNS服务器软件:有许多开源的DNS服务器软件可供选择,如Bind、PowerDNS、Unbound等。您可以根据自己的需求选择适合的软件。2. 安装和配置DNS服务器:根据
2023-08-12

如何在Java中自定义注解

这篇文章给大家介绍如何在Java中自定义注解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、自定义注解格式分析 Java 中自带的 @Override 注解 , 源码如下 :@Target(ElementType.M
2023-06-15

云原生Docker容器自定义DNS解析的方法是什么

这篇文章主要讲解了“云原生Docker容器自定义DNS解析的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“云原生Docker容器自定义DNS解析的方法是什么”吧!描述在特定的情况下
2023-07-05

Java中自定义注解如何使用

本文小编为大家详细介绍“Java中自定义注解如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中自定义注解如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是注解在早期的工作的时候 ,自定义
2023-07-05

浅析Java自定义注解的用法

注解为我们在代码中添加信息提供一种形式化的方法,使我们可以在源码、编译时、运行时非常方便的使用这些数据。本文主要为大家介绍了Java自定义注解的用法,希望对大家有所帮助
2023-03-21

如何解析DNS服务器

本篇文章给大家分享的是有关如何解析DNS服务器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。DNS(Domain Name System,域名系统),因特网上作为域名和IP地址
2023-06-07

Spring如何自定义注解

这篇文章将为大家详细讲解有关Spring如何自定义注解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。字段注解字段注解一般是用于校验字段是否满足要求,hibernate-validate依赖就提供了很多校验
2023-06-15

Java SpringMVC如何实现自定义拦截器

本篇内容主要讲解“Java SpringMVC如何实现自定义拦截器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java SpringMVC如何实现自定义拦截器”吧!SpringMVC实现自定义
2023-06-29

java如何实现自定义zip包

java如何实现自定义zip包?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.配置pom.xml文件,添加build节点