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

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 !」

想买一台台式电脑,专门玩英雄联盟的,请问全套配下来多少钱?这个配置我刚给你找的,算是不错的了,有核显,价格刚刚三千出头,鼠标键盘耳机之类的不过一二百,自己自由选择。虽然是个麻雀,但是都是比较不错的配置了,毕竟预算有限,也不能太差。电源不要做了多年电商,现在想转行,已经休息了半年了,不知道干嘛去?做电商不要急,先亏点冲销量做评价赚人气,慢慢做着做着就做倒闭了慢慢你会发现,忙活一圈,最后可能还是继续干电商。不同的就少了以前的憧憬和激情,就是单纯的一份工作。生意不好就压缩开支,如果真要打仗了,你会怎么办?我来回答!没有如果,真要打仗。做为一个中国人就应该为国家出征,去不了前线,我们就在后方。有钱出钱,没钱出力。又能怎么办?等死呗。炸弹要落下来小民挡不住。核弹杀伤面大认命吧。天要下雨大力教育学浪平台怎么样?想用自己的一技之长当副业?学浪平台是字节跳动大力教育旗下的一个打破学习者与创作者之间的障碍,让每个人都可以展示自己的一个平台。字节跳动大力教育的综合学习平台学浪是知识创作者与学习者的集结地,所以想用自己的一如何做一个家庭影院?需要购买什么?家庭影院就是一个无底洞,要看是商业还是家用。而这个非常考究个人的要求(包括经济能力房屋面积和审美水平等),不光需要好的音响,电视或者是4K投影,还需要灯光电动窗帘安放系统音视频共享主机接小显示器正常,接大显示器(31。5寸)开机一分钟就死机,是什么问题呢?根据你的描述若连接小显示器正常可以分以下步骤检查开机死机1替换检查换一台电脑主机连接31。5显示器看新换的这台电脑主机是否死机,若正常就要检查31。5的显示器或者是你原来的主机上显诺基亚新机曝光,采用14nm制程的三星处理器,Android12系统Android12是目前安卓最新的系统,于10月5日发布,各个手机厂商也在为这最新的系统做适配工作,准备发布新的操作系统。作为昔日手机大哥的诺基亚,被淘汰的其中一个原因,便是因为操SEO网站优化一直原创,为什么排名却总是上不去?即使你在SEO行业,有着几年的工作经验,你偶尔也会有这样的疑问,我长期的坚持写原创高质量内容,但有的时候,针对某些网站,它的排名就是上去。这让很多SEO人员,一度在怀疑自己的优化策比特币核心有什么用?BitcoinCore是该软件的领先实现,使用户能够与比特币网络进行交互。它不归任何单个企业或组织所有,而是由全球开发人员社区更新和审查。该软件最初由中本聪(以比特币为名)发布,后玩转Mockjs,前端也能跑的很溜mockjs作用就是,生成随机模拟数据,拦截ajax请求,可以对数据进行增删改查。在生成数据时,我们就需要能够熟练使用mock。js的语法。Mockjs的语法规范包括两部分数据模板西安软件公司那么多,我们用的软件却很少见西安开发的,这是为何?作为一个曾经在西安做过软件开发的技术人员回答一下,西安这边开发大致有这几这几种,首先呢,是大公司在西安的研发部门,比如像华为,中兴,都在西安设有研发机构,这些软件大部分都是自用或者
决策参考微信新增时刻视频和公众号好看按钮1微信版本更新新增时刻视频和公众号好看按钮事件12月21日晚,微信更新7。0。0版本,新增时刻视频功能公众号的点赞按钮变成好看,用户可在看一看里浏览朋友认为好看的文章在聊天详情页中竖视频迎来风口,竖屏剧将是视频网站争夺的新领地2018年,短视频无疑是互联网和视频领域的爆款,用户数使用时长市场规模都在高速增长。根据2018年中国网络视听发展研究报告显示,截至今年6月,短视频用户规模为5。94亿,占网络视频决策参考爱奇艺会员规模破1亿腾讯视频付费用户近9000万1爱奇艺会员规模破1亿,中国视频网站进入亿级会员时代事件近日,爱奇艺公布了其最新会员规模数据,爱奇艺会员数量突破1亿,中国视频付费市场正式进入亿级会员时代。2019年内容储备方面,比亚迪e2热销中优惠高达8000元给生活稳稳幸福感,2021款e2家庭纯电优选。配备高安全长寿命刀片电池严苛测试,关心和保障您的每次出行NEDC401KM超长续航满足日常上下班代步,户外郊游需求,畅行无忧直上绿牌,宋PLUS新能源售14。68万元起欢迎试驾驭见皆引领!全球首款宽体超混SUV领航上市!宋PLUSDMi上市价14。68万起(综合补贴后)创新采用骁云插混专用1。5L高效发动机高效EHS电混系统,达到短途用电经济节省,长途用庆余年读后的感觉之前看过电视剧庆余年,拍的不错,只不过最吸引我的不是剧情,而是里面对武道中人的分级挺有意思,什么大宗师,九品上,九品,八品对于一个也曾经有武侠梦的男人来说挺有吸引力的,可惜第二季还高级工程师如何使用6寸专业电脑?感觉智商被碾压GPDMicroPC是一台针对专业工程师用的6寸工具电脑,出场默认安装Win10专业版系统,因为机身自带RS232和RJ45网线接口,实际用途可以说是十分广泛。而国内有网友拿到机器这么小的掌上游戏电脑,玩魔兽世界怀旧服什么感觉,简直太爽了以前从来没想过,魔兽世界这样大型的网络游戏,有一天可以端在手上玩,现在GPDWIN2游戏掌机却真正做到了,一台6寸屏的掌上游戏电脑,单手拿起毫不费力,却能够完美的运行魔兽世界怀旧服8寸超级掌机性能超硬核,电脑AAA游戏大作玩出了手游感觉屏幕仅有8英寸,处理器是冰湖英特尔I51035G7,16G超大运行内存3733高频内存,这就是GPDWINMax超级掌上游戏机,机器还没正式开售,预计在5月20号京东开始预售。这次CSGO居然玩出了手游的感觉,8寸超级掌机性能太硬核GPDWINMax还有几天就要预售了,你们是不是感到很兴奋呢,最新消息就是5月18日在国外开启众筹,比国内早两天,国内则要等到5月20日,不过对于国内用户来说,好消息就是预售价格4现在的客户要求高,维修师傅感觉压力山大(原创)客户下午吃饭时提出海尔32寸液晶电视三无故障维修,并且要求晚上务必修好,说真的,我感觉亚历山大,首先因为状况不明,加之配件不齐全,不过办法总比困难多,硬着头皮顶吧,打开后盖,开机查