游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Java11新特性效能翻倍的HttpClient

  古老的背景
  从JDK1。1开始,JDK中就有HttpURLConnection来提供了网络连接的能力,但是由于实现的比较古早,其有很多的局限性。比如HttpURLConnection是通过底层提供的socket连接来进行通信,而每一个HttpURLConnection实例只能发送一个请求,之后只能通过close()释放请求的网络资源,或在持久化连接时用disconnect()来关闭关闭底层socket。而其基类URLConnection是为了支持很多协议而设计的,但诸如FTP这种协议已经不咋用了。
  HttpURLConnection并不是不能使用,由于不需要依赖,在一些demo项目的时候也会偶尔拿来用。但HttpURLConnection本身已经太过古早,并且很难说HttpURLConnection能够胜任包含各种鉴权信息、各种COOKIE信息的访问请求。
  针对这种情况网络上各种大神提供了更多高级的封装,比较流行的有Apache的HttpClient、OkhttpClient、SpringCloudFeign之类的。这些封装提供了更丰富的资源与更便捷的封装,也支持了更高级功能如HTTP2协议、异步请求等。
  不过到了JDK9的时候,Java提供了一个新的Http请求工具HttpClient,经过了JDK10的再次预览,最终在JAVA11中作为正式功能提供使用,同时也完全替换了仅有阻塞模式的HttpURLConnection。HttpClient简介
  作为JDK11中正式推出的新Http连接器,支持的功能还是比较新的,主要的特性有:完整支持HTTP2。0或者HTTP1。1支持HTTPSTLS有简单的阻塞使用方法支持异步发送,异步时间通知支持WebSocket支持响应式流
  HTTP2。0其他的客户端也能支持,而HttpClient使用CompletableFuture作为异步的返回数据。WebSocket的支持则是HttpClient的优势。响应式流的支持是HttpClient的一大优势。
  而HttpClient中的NIO模型、函数式编程、CompletableFuture异步回调、响应式流让HttpClient拥有极强的并发处理能力,所以其性能极高,而内存占用则更少。
  HttpClient的主要类有:java。net。http。HttpClientjava。net。http。HttpRequestjava。net。http。HttpResponsejava。net。http。WebSocket(本文就不介绍这个了)
  细节会在后文介绍,但是WebSocket用的比较少,本文就略过了。核心使用
  HttpClient的核心类主要就是HttpClient、HttpRequest以及HttpResponse,它们都是位于java。net。http包下,接下来对他们进行一下介绍。HttpClient
  HttpClient类是最核心的类,它支持使用建造者模式进行复杂对象的构建,主要的参数有:Http协议的版本(HTTP1。1或者HTTP2。0),默认是2。0。是否遵从服务器发出的重定向连接超时时间代理认证可以用参数调整HttpClientclientHttpClient。newBuilder()。version(Version。HTTP11)。followRedirects(Redirect。NORMAL)。connectTimeout(Duration。ofSeconds(20))。proxy(ProxySelector。of(newInetSocketAddress(proxy。example。com,8080)))。authenticator(Authenticator。getDefault())。build();也可以直接全部默认的便捷创建HttpClientclientSimpleHttpClient。newHttpClient();
  当创建了HttpClient实例后,可以通过其发送多条请求,不用重复创建。HttpRequest
  HttpRequest是用语描述请求体的类,也支持通过建造者模式构建复杂对象,主要的参数有:请求地址请求方法:GET,POST,DELETE等(默认是GET)请求体(按需设置,例如GET不用body,但是POST要设置)请求超时时间(默认)请求头使用参数组合进行对象构建,读取文件作为请求体HttpRequestrequestHttpRequest。newBuilder()。uri(URI。create(http:www。baidu。com))。timeout(Duration。ofSeconds(20))。header(Contenttype,applicationjson)。POST(HttpRequest。BodyPublishers。ofFile(Paths。get(data。json)))。build();直接GET访问HttpRequestrequestSimpleHttpRequest。newBuilder(URI。create(http:www。baidu。com))。build();
  HttpRequest是一个不可变类,可以被多次发送。HttpResponse
  HttpResponse没有提供外部可以创建的实现类,它是一个接口,从client的返回值中创建获得。接口中的主要方法为:publicinterfaceHttpResponseT{publicintstatusCode();publicHttpRequestrequest();publicOptionalHttpResponseTpreviousResponse();publicHttpHeadersheaders();publicTbody();publicURIuri();publicOptionalSSLSessionsslSession();publicHttpClient。Versionversion();}
  HttpResponse的返回内容与常识一致,这里就不展开介绍了。信息发送
  HttpClient中可以使用同步发送或者异步发送。
  同步send()
  同步发送后,请求会一直阻塞到收到response为止。finalHttpResponseStringsendclient。send(httpRequest,HttpResponse。BodyHandlers。ofString());System。out。println(send。body());
  其中send的第二个参数是通过HttpResponse。BodyHandlers的静态工厂来返回一个可以将response转换为目标类型T的处理器(handler),本例子中的类型是String。HttpResponse。BodyHandlers。ofString()的实现方法为:publicstaticBodyHandlerStringofString(){return(responseInfo)BodySubscribers。ofString(charsetFrom(responseInfo。headers()));}
  其中,BodySubscribers。ofString()的方法实现是:publicstaticBodySubscriberStringofString(Charsetcharset){Objects。requireNonNull(charset);returnnewResponseSubscribers。ByteArraySubscriber(bytesnewString(bytes,charset));}
  可以看到最终是返回了一个ResponseSubscribers,而Subscribers则是我们之前《JDK9响应式编程》中讨论过的订阅者。这个构造方法的入参Functionbyte〔〕,T定义了订阅者中的finisher属性,而这个属性将在响应式流完成订阅的时在onComplete()方法中调用。
  异步sendAsync()
  异步请求发送之后,会立刻返回CompletableFuture,然后可以使用CompletableFuture中的方法来设置异步处理器。client。sendAsync(httpRequest,HttpResponse。BodyHandlers。ofString())。thenApply(HttpResponse::body)。thenAccept(System。out::println)。join();
  而就如同JDK中响应式流中发布者的submit()方法与offer()方法一样,HttpClient中的send()方法知识sendAsync方法的特例,在send()方法中是先调用sendAsync()方法,然后直接阻塞等待响应结束再返回,部分核心代码为:OverridepublicTHttpResponseTsend(HttpRequestreq,BodyHandlerTresponseHandler)throwsIOException,InterruptedException{CompletableFutureHttpResponseTcfnull;ifthethreadisalreadyinterruptednoneedtogofurther。cf。get()wouldthrowanyway。if(Thread。interrupted())thrownewInterruptedException();try{cfsendAsync(req,responseHandler,null,null);returncf。get();}catch(InterruptedExceptionie){if(cf!null)cf。cancel(true);throwie;}。。。
  响应式流
  HttpClient作为Request的发布者(publisher),将Request发布到服务器,作为Response的订阅者(subscriber),从服务器接收Response。而上文中我们在send()的部分发现,调用链的最底端返回的是一个ResponseSubscribers订阅者。
  当然,就如同HttpResponse。BodyHandlers。ofString(),HttpClient默认提供了一系列的默认订阅者,用语处理数据的转换:HttpRequest。BodyPublishers::ofByteArray(byte〔〕)HttpRequest。BodyPublishers::ofByteArrays(Iterable)HttpRequest。BodyPublishers::ofFile(Path)HttpRequest。BodyPublishers::ofString(String)HttpRequest。BodyPublishers::ofInputStream(SupplierInputStream)HttpResponse。BodyHandlers::ofByteArray()HttpResponse。BodyHandlers::ofString()HttpResponse。BodyHandlers::ofFile(Path)HttpResponse。BodyHandlers::discarding()
  所以在HttpClient的时候我们也可以自己创建一个实现了Flow。SubscriberListByteBuffer接口的订阅者,用于消费数据。响应式流完整的简单的例子如下:publicclassHttpClientTest{publicstaticvoidmain(String〔〕args)throwsIOException,InterruptedException{finalHttpClientclientHttpClient。newHttpClient();finalHttpRequesthttpRequestHttpRequest。newBuilder(URI。create(http:www。baidu。com))。build();HttpResponse。BodySubscriberStringsubscriberHttpResponse。BodySubscribers。fromSubscriber(newStringSubscriber(),StringSubscriber::getBody);client。sendAsync(httpRequest,responseInfosubscriber)。thenApply(HttpResponse::body)。thenAccept(System。out::println)。join();}staticclassStringSubscriberimplementsFlow。SubscriberListByteBuffer{Flow。Subscriptionsubscription;ListByteBufferresponsenewArrayList();Stringbody;publicStringgetBody(){returnbody;}OverridepublicvoidonSubscribe(Flow。Subscriptionsubscription){this。subscriptionsubscription;subscription。request(1);}OverridepublicvoidonNext(ListByteBufferitem){response。addAll(item);subscription。request(1);}OverridepublicvoidonError(Throwablethrowable){System。err。println(throwable);}OverridepublicvoidonComplete(){byte〔〕datanewbyte〔response。stream()。mapToInt(ByteBuffer::remaining)。sum()〕;intoffset0;for(ByteBufferbuffer:response){intremainbuffer。remaining();buffer。get(data,offset,remain);offsetremain;}bodynewString(data);}}}最后
  HttpClient是JDK11正式上线的高性能Http客户端。其底层基于响应式流,通过上层封装还提供了异步信息发送、同步信息发送,以及其他完成的HTTP协议内容。在进行响应式编程的方面,HttpClient也是一个十分优秀的参照目标。

郑恺张雨绮徐冬冬最佳男友撞上复联4网友凉凉?星关系4月28日讯近日,由郑恺、徐冬冬领衔主演,张雨绮特别主演的院线喜剧电影《最佳男友进化论》正在热映中,该片于2019年4月12日登陆全国院线,自热映以来,影片以正宗的港式无……演员咏梅主演王小帅电影地久天长入围柏林电影节主竞赛单元星关系1月11日讯柏林当地时间1月10日下午,柏林电影节组委会官方宣布电影《地久天长》入围第69届柏林电影节主竞赛单元。该片由王小帅执导,王景春、咏梅、齐溪、杜江、王源等联袂主……狂收智商税?高考志愿填报规划居然叫价上万元随着2021高考收卷铃声的响起,学生们考试结束的同时,也意味着家长们的考试正式开始了!一直以来,填报志愿都是个让人倍感焦虑的问题,稍有差池,就可能会影响孩子未来的人生走向……达叔一路走好肝癌致死率为什么那么高?大家好,我是老李。今天和大家缅怀一下达叔。老李我昨天下午在见客户的时候才看到吴孟达老师进了ICU,见完客户就看到了逝世的消息,一时之间真的无法相信,因为在我的记忆中……转型团伙曝终极预告吴镇宇乔杉爆笑逐梦电影圈星关系4月16日讯由吴镇宇主演并担当导演,乔杉、文松、吴志雄、衣云鹤主演,费曼倾情加盟,于莎莎、任达华等友情出演的喜剧电影《转型团伙》将于4月19日公映。今日片方曝光一决高下版……吴镇宇乔杉费曼谁是最强大佬?转型团伙五大巨头关系成谜星关系4月8日讯由吴镇宇主演并担当导演,乔杉、文松、吴志雄、衣云鹤主演,费曼倾情加盟,于莎莎、任达华等友情出演的喜剧电影《转型团伙》已经正式定档2019年4月19日。作为四月下……吴镇宇乔杉联手干电影电影转型团伙笑转419星关系3月21日讯由吴镇宇主演并担当导演,乔杉、文松、吴志雄、衣云鹤主演,费曼倾情加盟,于莎莎、任达华等友情出演的喜剧电影《转型团伙》,今日宣布定档2019年4月19日。片方同……神探蒲松龄大年初一贺岁上映乔杉东北式幽默让你一起笑出来星关系1月22日讯由成龙主演的奇幻贺岁电影《神探蒲松龄》,将在大年初一在全国影院上线。影片集结了阮经天、钟楚曦、林柏宏领衔主演,林鹏、乔杉、潘长江、苑琼丹、LuuBrother……陈奕迅献唱银河补习班推广曲酒泉路演航天人热血沸腾星关系7月5日讯不要让爱的人久等!电影《银河补习班》于7月5日开启全国预售,观众现在通过各大购票平台即可抢先购票。7月4日,邓超、俞白眉携影片来到酒泉航天城,奋战在一线的中国航……实力歌者金志文为汪发声犬之岛推广曲传递人狗友谊由韦斯安德森执导的好莱坞动画大片《犬之岛》即将于4月20日登陆全国银幕,今日影片发布了推广曲《我是谁》MV。歌曲由金志文倾情献唱,他用极富特色的音色和深情的唱腔将狗狗对主人忠诚……套牢了就别剁手了,但也别徒手接飞刀大家好,我是老李。今天和大家聊聊股市。韭零后、跌妈不认、亏无波澜、韭韭八十一难、我的钱像大风刮走了、辛弃基、杜负、白交易股市这几天跌成了狗,大家挣不到钱干脆开起了吐……沈腾常远徐冬冬张一鸣在西虹市首富做了什么就火了?星关系11月6日讯距离院线喜剧大片《西虹市首富》7月27日上映已将有4个月,该片一上线,票房便一路冲升,披荆斩棘,万夫莫开,将同期热映的其他电影遥遥甩开,直奔冠军宝座,最终票房……
父亲,是你决定了孩子中学阶段能否过好!当爹的一定要好好看看我们都知道,在孩子的成长过程中,父母言传身教对孩子的一生有着重要的影响!但大部分人不知道,随着孩子的成长,需要的母性之爱呈递减趋势,父性之爱呈递增趋势。中学阶段是孩子成长的浪漫……中国真奇妙重庆这三个区到重庆主城区都要超过200公里重庆1997年重庆成为中央直辖市。重庆:简称渝读yu第四声。重庆:别名山城重庆:总面积8。24万平方公里重庆:辖区26个、8个县、4个自治县……互联网新营销模式,社群6步骤商业的时代演变历程:生产时代产品时代分销时代网销时代商盟时代分享时代社群时代。时代在变则商业也在变,开始是生产时代的时期,因为生产力低,几乎所有开厂加工都能赚到一笔钱财,到了互……大半年来这些钱没白花618好物清单前言2020年下半年开始做一个小工作室,从场地的选取、租赁到办公设备的选购做了不少功课也走不少弯路,这大半年用了不少东西,既有小家电等好物,也有高校的电脑数码类,这篇文章……Arduino梦幻交互雪花2019梦幻雪花由30颗LED打造,分为17个独立的部分,由ArduinoNano控制。每组LED都可以用PWM调校,这样就可以创作出梦幻视觉效果。首先打印一个漂亮而简单的雪花,……面对房价上涨,苹果捐25亿美元帮年轻人买房,网友有我一部分刚刚,手机界的网红苹果又登上了热搜。这次不是某个系统出了漏洞,也不是突然发布了新品,而是苹果捐了25个亿去帮助美国的年轻人买房。跟中国住房自有率高达83恰恰相反,在美国大……日常开发踩坑前端数据并不可信作者浩说编程来源公众号:浩说编程〔大厂技术资源研发必备安装包限时免费获取〕在我们的日常业务开发中,和前端的数据交互是必不可少的,通常前端会将参数以json格式……2021年11月工作日历工作计划怎么写?试试这款日历便签2021年的11月份已经到了,很多人在新的一个月开始之际,会制定工作计划来让自己的工作更有目标,把工作计划标记在日历中,会让自己在时间上可以更好的把控。2021年11月工作日历……4G路由器无需装宽带停电不断网将傻白甜wifi进行到底家里没宽带,台式机如何上网?户外玩直播,流量不够怎么办?小店收银加监控,不拉宽带行不行?工地办公和联网,荒无人烟咋个搞?莫慌,只需一台4G路由器,这些难题通通搞定。……寒假生存指南是时候换上这款惠普Spectrex360了在经历了紧张复习的期末考试后,学生党们终于将迎来心心念念的寒假。假期悠长,正是学习充电的好时机,很多小伙伴们都不想将假期白白浪费,而希望在这空闲的一个多月中有所学习有所提升。然……海尔空调两大空气场景全新发布,首发新品黑科技智竞未来3月23日,中国家电及消费电子博览会(简称:AWE)在上海世博中心拉开序幕。在这场汇聚数百家国内外一线品牌的展示平台上,海尔空调携健康空气场景解决方案和新品黑科技雷神者睡眠空调……春秋时期齐国名相晏婴之墓晏婴,聪颖机智,能言善辩,祖籍山东省高密市,字号平仲春秋战国时期齐国宰相,曾经辅佐过齐灵公、齐庄公和齐景公,可谓三朝元老,在朝辅政五十多年,为齐国的强胜立下不朽的功勋,橘生淮南……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网