范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java自定义DNS解析器负载均衡实现

  在上文Java自定义DNS解析器实践中,我们没有讲到org.apache.http.conn.DnsResolver具体如何实现负载均衡,今天我们就分享一下,负载均衡的具体实现。  InMemoryDnsResolver被淘汰
  首先上期文章提到的org.apache.http.impl.conn.InMemoryDnsResolver类是无法实现负载均衡的,原因是这个实现类是将host和IP存在一个java.util.concurrent.ConcurrentHashMap中,然后解析的时候从java.util.concurrent.ConcurrentHashMap根据host获取到IP的,所以无法进行负载均衡。
  使用的Demo如下:      /**      * 重写Java自定义DNS解析器,非负载均衡      *      * @return      */     private static DnsResolver getDnsResolver2() {         InMemoryDnsResolver dnsResolver = new InMemoryDnsResolver();          try {             logger.warn("调用一次");             dnsResolver.add("fun.tester", InetAddress.getByName("127.0.0.1"));         } catch (Exception e) {             e.printStackTrace();         }          return dnsResolver;
  其中org.apache.http.impl.conn.InMemoryDnsResolver#add方法源码如下:      public void add(String host, InetAddress... ips) {         Args.notNull(host, "Host name");         Args.notNull(ips, "Array of IP addresses");         this.dnsMap.put(host, ips);     }
  然后我们看一下org.apache.http.impl.conn.InMemoryDnsResolver#dnsMap相关初始化代码:      /**      * In-memory collection that will hold the associations between a host name      * and an array of InetAddress instances.      */     private final Map dnsMap;      /**      * Builds a DNS resolver that will resolve the host names against a      * collection held in-memory.      */     public InMemoryDnsResolver() {         dnsMap = new ConcurrentHashMap();     }  SystemDefaultDnsResolver
  最终我放弃了自定义的org.apache.http.conn.DnsResolver接口的方案,选择了org.apache.http.impl.conn.SystemDefaultDnsResolver重写resolve方法的方案,具体实现如下:      /**      * 重写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[]{SourceCode.random(ips)};                 } else {                     return super.resolve(host);                 }             }         };     }
  其中ips是全局的静态变量,初始化方法如下:      /**      * 初始化DNS配置IP      *      * @return      */     private static List getAddress() {         try {              return Arrays.asList(                     InetAddress.getByName("127.0.0.1"),                     InetAddress.getByName("0.0.0.0")             );         } catch (Exception e) {             FailException.fail("DNS IP解析失败!");         }         return null;     }
  PS:如果你选择使用了自定义的DNS解析器,那么系统hosts配置的功能就会失效,所以谨慎使用。  测试
  为了验证结果,我对com.funtester.httpclient.ClientManage#getDnsResolver方法进行了改造,每次获取到IP的时候我都打印出来。      /**      * 重写Java自定义DNS解析器,负载均衡      *      * @return      */     private static DnsResolver getDnsResolver() {         return new SystemDefaultDnsResolver() {             @Override             public InetAddress[] resolve(final String host) throws UnknownHostException {                 if (host.equalsIgnoreCase("fun.tester")) {                     InetAddress random = SourceCode.random(ips);                     logger.info(random);                     return new InetAddress[]{random};                 } else {                     return super.resolve(host);                 }             }         };     } 单线程
  下面看我的测试,首先分享测试用例:      public static void main(String[] args) {         String url = "http://fun.tester:12345/"         def get = getHttpGet(url)         def test = {             getHttpResponse(get)         }         10.times {             test()         }     }
  控制台输出:  INFO-> 13.691 main    ###### #     #  #    # ####### ######  #####  ####### ######  #####   #      #     #  ##   #    #    #       #         #    #       #    #   ####   #     #  # #  #    #    ####    #####     #    ####    #####   #      #     #  #  # #    #    #            #    #    #       #   #   #       #####   #    #    #    ######  #####     #    ######  #    #  INFO-> 14.408 main /0.0.0.0 INFO-> 14.460 main 请求uri:http://fun.tester:12345/ , 耗时:451 ms , HTTPcode: 200 INFO-> 14.462 main 请求uri:http://fun.tester:12345/ , 耗时:2 ms , HTTPcode: 200 ****省略多余的内容****
  可以看出,单线程请求HTTP服务,DNS只会解析一次,经过多次尝试,解析的IP会在设定的两个IP之间随机出现,但这明显不符合我们的需求。  多线程
  测试用例如下:      public static void main(String[] args) {         String url = "http://fun.tester:12345/"         def get = getHttpGet(url)         def test = {             fun {                 getHttpResponse(get)             }         }         10.times {             test()         }     }
  控制台输出:  INFO-> 03.636 main    ###### #     #  #    # ####### ######  #####  ####### ######  #####   #      #     #  ##   #    #    #       #         #    #       #    #   ####   #     #  # #  #    #    ####    #####     #    ####    #####   #      #     #  #  # #    #    #            #    #    #       #   #   #       #####   #    #    #    ######  #####     #    ######  #    #  INFO-> 04.581 Deamon 守护线程开启! INFO-> 04.843 F-6  /0.0.0.0 INFO-> 04.843 F-4  /127.0.0.1 INFO-> 04.843 F-7  /0.0.0.0 INFO-> 04.844 F-2  /0.0.0.0 INFO-> 04.844 F-10 /0.0.0.0 INFO-> 04.844 F-1  /0.0.0.0 INFO-> 04.844 F-5  /127.0.0.1 INFO-> 04.844 F-3  /127.0.0.1 INFO-> 04.844 F-8  /0.0.0.0 INFO-> 04.844 F-9  /127.0.0.1  INFO-> 04.903 F-7  请求uri:http://fun.tester:12345/ , 耗时:309 ms , HTTPcode: 200 INFO-> 04.903 F-3  请求uri:http://fun.tester:12345/ , 耗时:309 ms , HTTPcode: 200 INFO-> 04.903 F-2  请求uri:http://fun.tester:12345/ , 耗时:309 ms , HTTPcode: 200 ****省略多余的内容****
  这下我们就能看出每个线程都执行了一次org.apache.http.impl.conn.SystemDefaultDnsResolver#resolve方法,获取到了IP也是随机的,而且每次请求的耗时都是比较长的。这里让我心生疑惑,相当于每个线程请求都是重新重建了连接,于是就有了下面的测试。  单个连接
  这里我把HttpClient的连接池的最大连接数改成了1:public static int MAX_PER_ROUTE_CONNECTION = 1;或者public static int MAX_TOTAL_CONNECTION = 1;,这个之前分享过,这里不多讲了,上用例:  用例同多线程用例
  控制台输出:  INFO-> 02.928 main    ###### #     #  #    # ####### ######  #####  ####### ######  #####   #      #     #  ##   #    #    #       #         #    #       #    #   ####   #     #  # #  #    #    ####    #####     #    ####    #####   #      #     #  #  # #    #    #            #    #    #       #   #   #       #####   #    #    #    ######  #####     #    ######  #    #  INFO-> 03.648 Deamon 守护线程开启! INFO-> 03.910 F-5  /0.0.0.0 INFO-> 03.961 F-6  请求uri:http://fun.tester:12345/ , 耗时:299 ms , HTTPcode: 200 INFO-> 03.961 F-5  请求uri:http://fun.tester:12345/ , 耗时:299 ms , HTTPcode: 200 INFO-> 03.961 F-4  请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200 INFO-> 03.961 F-7  请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200 INFO-> 03.961 F-3  请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200 INFO-> 03.961 F-2  请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200 INFO-> 03.961 F-1  请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200 INFO-> 03.961 F-9  请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200 INFO-> 03.961 F-8  请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200 INFO-> 03.961 F-10 请求uri:http://fun.tester:12345/ , 耗时:300 ms , HTTPcode: 200 WARN-> 04.673 Deamon 异步线程池关闭!
  这里看到虽然我起了10个线程分别执行请求,但是每个请求的耗时都是非常长的,但是只有F-5这个线程执行了一次org.apache.http.impl.conn.SystemDefaultDnsResolver#resolve方法,由于HttpClient只有一个连接。所以应当是每个连接创建的时候会调用org.apache.http.impl.conn.SystemDefaultDnsResolver#resolve方法,而每个线程请求耗时比较高,原因是因为每个线程去获取到链接资源之后,会重新进行建联的过程导致的。
  实践出真知,奇怪的知识又增加了。  「Have Fun ~ Tester !」

二手回收暴利行业,旧衣服的全球化出口,它们拯救了非洲?旧衣服不是垃圾,旧衣服全都是宝。旧衣服如果被当作垃圾处理,最后只能焚烧或者掩埋,这不仅是对资源的极大浪费,也会加大环境污染。国内旧衣服的回收率不到10,对比其他行业来说,还处于最初艾特铭客金刚6mini体验,外表迷你,内芯强大,K歌功能加分蓝牙小音箱,给不少人的印象是音质不行。究其原因,是现在市面上充斥着众多几十元档的小音箱,音质不好早就注定,这就让人们产生了固定的思维误区。其实,无论是大音箱还是小音箱,只要芯足够强鼠标办公新体验,咪鼠智能语音鼠标S6使用分享,享受轻奢智能提起科大讯飞,相信大家对这个企业不会感到陌生,近期常常因为出众的技术能力受到关注。科大讯飞技术的应用很多,特别专注企业级产品。而在个人领域,感知较少,或者我们在用了,却不一这有发觉又一国产电脑问世!曾被认为是骗子,今把缺芯少屏甩进太平洋如果回到2010年,恐怕很多人会想起,那会中国还没有搭建成熟的电子产品产业链,既没有完整的PC产业链,也没有智能手机产业链,并且始终被缺芯少屏所困扰,而产业链的核心,基本上掌握在欧红魔智能生态发布会话说近期发布的手机都是游戏手机啊,前有拯救者ROG,后有即将召开发布会的红魔5s,还有一个开始预热的黑鲨3s,7月可以说是游戏手机专属的moment。红魔新品发布会将于7月28日召经典!30张图让你彻底搞懂HTTP面试题,学会后打败70的面试者程序员应该都知道,HTTP在面试中出现的频率不亚于请你自我介绍一下,很多程序员在面试时仿佛把之前学的内容都还回去了,这说明你的技能掌握还不够扎实,要想顺利拿下offer,得到心仪的诺印灭蚊灯评测无化学成分,物理灭蚊更安全,给你母亲般的呵护都说O型血招蚊子,怎么到我这就不管用了呢?难道我是太年轻,蚊子喜欢肉嫩的?不管了,先来一波杀虫剂杀杀它们的锐气。半小时过后,房间里再也没有蚊子了。蚊子是没有了,然而房间味道太大根本可以戴着睡觉的蓝牙耳机!魔浪mifoS评测更小更轻更安全下夜班回家想补个觉,然而白天各种噪音吵得自己无法入睡。无奈之下入手了一款睡眠耳机,这才解决了这个问题。下面我和大家分享一下这款耳机,如果你睡觉也被噪音所困扰,那么它将成为你的救星!用过离不开系列这个数显充电宝,好而不贵,iPhone13很配今年的iPhone13还真是果粉眼中的香饽饽,下暴雨都挡不住广大果粉到直营店取货的热情。最近本人也是入了远峰蓝版iPhone13,毕竟加量不加价,还是挺香的。作为千年苹果党,虽然沉我有几把木吉他飞朵GEM4林氏评测做耳机这种事,属于典型的易学者难工,你去找个代工厂,让人给你个方案给你找个现成模具,选对单元再选条线,把单元塞进去壳子焊上,这耳机能响就行,那真不费什么劲,简单到就像给你把吉他让你你长大了,你比以前从容多了HIDIZSS9PRO解码耳放小尾巴对于音频厂商来说,苹果就像是个难以捉摸的妖艳女后,其实茶得很你以为她对你挺好的时候,她会忽然攮你一刀,攮完眼瞅你要死了,觉得故事这就要结束了,她却又扭过来给你止血,止完亲你一口,等
怀柔科学城长城海纳硬科技加速器开园新华网北京4月1日电(田晨旭张佳玮范晓琦)3月31日,北京怀柔综合性国家科学中心硬科技产业园示范项目长城海纳硬科技加速器正式开园,园区聚焦高端仪器装备和传感器产业项目,首批迎来13领湃新能源连获3个定点从车企相继扶持二线电池厂来看,出逃电池巨头的趋势越发明显。今年以来,一线以下的电池厂纷纷拿到车企订单或者定点。比如,欣旺达获得上汽集团ZS12MCEHEV项目定点,捷威动力与奇瑞新大公司早报拼多多诉争拼夕夕商标被驳回字节跳动入局卖酒(整理卢思叶)今天是4月2日星期六,过去的二十四小时有这些公司动态可以关注京东裁员仍在继续孟晚舟担任华为轮值董事长比亚迪半导体IPO审核再被中止先来看互联网公司动态京东裁员仍在继续重磅!孟晚舟升任华为轮值董事长原标题重磅!孟晚舟升任华为轮值董事长坐实了!俄称掌握美军方直接参与乌境内生物实验的证据美债又崩了!收益率曲线15年来首现倒挂公司4月1日晚间,华为发布公告,宣布完成了监事会换届选举王传福原材料价格暴涨是挑战电池能量密度重要性在降低中新经纬4月2日电中国不可能从燃油车时代被石油卡脖子,变成电动车时代被金属钴金属镍卡脖子。4月1日下午,比亚迪以投资者文字问答方式召开2021年年度报告网上说明会。比亚迪董事长总裁本报评论5G基站辐射会影响健康吗?当前,5G信息技术的推广应用正在如火如荼地进行。5G通信基站也如雨后春笋般在各地开工建设。笔者发现,近一两年,涉及5G通信基站建设的群众信访也随之增多。不少群众认为,5G通信基站存孟晚舟担任华为轮值董事长英特尔计划收购Granulate理想汽车3月交付11034辆据36氪,理想汽车公布2022年3月交付数据。2022年3月,理想汽车交付11034辆理想ONE,同比增长125。2。2022年第一季度,理想汽车累计交尼康D7100用了四五年,想升级一台全画幅,求推荐?尼康D7100用了四五年,想升级一台全画幅,求推荐?尼康的D7100在上市的时候也是尼康半幅的旗舰机型,同时代的入门级全画幅单反型号是D700。谈到这个话题,又勾起了我满满的回忆。16。5元200g联通流量卡是真的吗?物联卡流量虚,网速不稳定,没有正宗号码卡网速快,还有些是跑路卡,说不定流量没用完,卡就用不了了,或者忽悠你左换一张卡,右换一张卡。要用物联卡可以选择大公司的,价格合适的,越便宜越不手机电量保持在4080时,为延长电池寿命,长期不充满电会对电池造成损害吗?锂电池与铅酸蓄电池有所区别,电动车电池如果用后电量减小极板中酸度越高,只有充足电存放才能延长电池寿命。对于锂电池我收集和捣弄的太多了,我有几块电池充好忘了用它,三年后其中一块还是3每个企业建设了越来越多的应用系统,集成是越来越难,重新架构又不可能,该怎么破?天下事有难易乎,为之则难者亦易矣,不为则易者亦难矣。如果应用系统越来越多越来越杂越来越散,至少说明公司业务蓬勃发展日进斗金,不然哪有钱来进行信息化建设。但信息化建设之前没有规划规划