首页 > 作文

Java9新特性对HTTP2协议支持与非阻塞HTTP API

更新时间:2023-04-06 03:58:59 阅读: 评论:0

在http/1.1 发布了16 年之后,ietf在2015年终于通过了http/2 协议。http/2协议旨在降低延迟,满足当今时代对于信息响应时间的要求。在这篇文章中,我会简要的对http/2协议进行介绍,然后我们将重点放在研究java9中对http/2支持及其http客户端api的变化。

一、http/2简介

http/2 旨在减轻 http/1.1 维护复杂基础结构所造成的痛苦,性能良好。尽管 http/2 仍然与 http/1.1 向后兼容,但它不再是基于文本的协议。

http/2 多路复用使单个连接可以处理多个双向流,允许客户端通过单个连接同时下载多个资源。

http 1.x 协议是基于文本的,因此报文很冗长。有的时候,同一组 http headers被一遍又一遍地交换。http/2 通过跨请求维护 http headers,消除重复交换的数据,大大减少了数据交互所需的带宽。

http/2数据推送

您可能认为http/2的服务端数据推送是对 websockets 的某种延续或升级,但情况并非如此。虽然 websockets 是客户端和服务器之间全双工通信的一种方法,以便服务器在建立 tcp 连接后将数据发送到客户端,但 http/2 提供了一种不同的解决方案。

http/2 推送是主动向客户端发送资源,而无需从客户端的角度发起资源请求。这意味着服务器端根据一个请求可能知道网站进一步需要的其他资源,并且早在客户端再次发起请求它们之前,就可以一并(提前)发送所有资源。

目前支持 http/2 的 java http 客户端

jettynettyokhttpvert.xfirefly

但是在这篇文章中,我们不会介绍这些java 客户端软件,而是介绍java9提供的http/2支持。

二、java 9 的 http/2 客户端

首先使用java 9的语法进行模块的导入 。jdk.incubator.httpclient

module com.springui.echo.client {    requires jdk.incubator.httpclient;}

java 9 新的 http cient api 遵循构建器模式。httpclient是用来操作http请求的入口点,先构建后使用。

httpclient client = httpclient    .newbuilder()    .version(version.http_2)  //支持http2    .build();

在阻塞模式下发送请求

一旦我们有了一个 httpclient实例,就可以用它来发送httprequest,httprequest实例也可以使用构造器创建。

httprespon<string> respon = client.nd(    httprequest        .newbuilder(test_uri)  //请求地址        .post(bodyprocessor.fromstring("hello world")) //post报文数据        .build(),    bodyhandler.asstring()  //请求响应数据处理,接收字符串);

请求发出去之后,线程会一直阻塞直到得到响应数据,这个和java 8及之前的http api是一样的。但是java 9提供了以异步非阻塞发送处理请求的方法,更适合高并发的http请求与处理。

以非阻塞模式发送请求(java 9)

在下面的示例中,10 个随机整数以异步方式发送请求。

list<completablefuture<string>> responfutures =         intstream.of(1,2,3,4,5,6,7,8,9,10)  //10个整数形成intstream,java 8的语法        .maptoo乔迁之喜对联大全bj(string::valueof) //10个整数转换成字符串,java 8的语法        .map(message -> client.ndasync( //将10个整数字符串作为内容,发送10个异步请求                httprequest.newbuilder(test_uri)                        .post(httprequest.bodyprocessor.fromstring(message))                        .build(),                httprespon.bodyhandler.asstring()             ).thenapply(httprespon::body)  //以completablefuture<httprespon.b疏通经络ody()>作为流处理的返回值        )        .collect(collectors.tolist());  //将stream转成list

上面的例子大量的使用了java 8的stream流式处理的api,如果不熟悉的同学,可以翻看我以前写的一些文章。

ndasync方法的返回值completablefuture<httprespon<string>>,使用thenapply(h听证申请ttprespon::body) 作了进一步的处理,最终返回值是completablefuture<string>。

completablefuture是java异步编程的知识,将并发的异步处理结果打印出来。

responfutures.stream().foreach(future -> {    logger.info("async respon: " + future.getnow(null));});

你会注意到,最终的打印日志可能不是按照顺序1、2、3、4、5、6、7、8、9、10进行处理的,因为所有的请求都是异步发送出去的,返回的结果是completablefuture用于异步处理的结果。

三、支持http2的push-promi frames

以上所有示例在 http/1.1协议下都可以完成,只是新加了非阻塞的异步api,也没涉及到 http/2 特性啊。别急,java 9 client api与http/2结合最紧密的就是:可以使用http2发送一个请求,得到多个异步数据结果。(某些数据提前推送,当然这需要服务端也支持http/2进行配合)

map<httprequest,completablefuture<httprespon<string>>> respons =        client.ndasync(    //注意这里只发送一次请求          httprequest.newbuilder(test_uri)                  .post(httprequest.bodyprocessor.fromstring(test_message))                  .build(),          httprespon.multiprocessor.asmap(    //多个资源的响应结果            新民主主义总路线      request -> optional.of(httprespon.bodyhandler.asstring())          )).join();respons.foreach((request, responfuture) -> {  logger.info("async respon: " + responfuture.getnow(null));});

从java 9的角度来看,新的http/2客户端api看起来不错。但笔者觉得目前相关技术的使用还不是很成熟,我觉得大家暂时尝尝鲜就可以。

以上就是java9新特性对http2协议的支持与非阻塞http api的详细内容,更多关于支持http2协议及非阻电子商务行业塞http api的资料请关注www.887551.com其它相关文章!

本文发布于:2023-04-06 03:58:58,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/1464bbd5c04468057a40887f5c67a6c0.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Java9新特性对HTTP2协议支持与非阻塞HTTP API.doc

本文 PDF 下载地址:Java9新特性对HTTP2协议支持与非阻塞HTTP API.pdf

标签:客户端   数据   协议   多个
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图