iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java9对HTTP2协议支持与非阻塞HTTP API实例分析
  • 455
分享到

Java9对HTTP2协议支持与非阻塞HTTP API实例分析

2023-06-29 12:06:25 455人浏览 安东尼
摘要

这篇文章主要介绍了Java9对Http2协议支持与非阻塞HTTP api实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java9对HTTP2协议支持与非阻塞HTTP API实例分析文

这篇文章主要介绍了Java9对Http2协议支持与非阻塞HTTP api实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java9对HTTP2协议支持与非阻塞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 客户端

  • Jetty

  • Netty

  • OkHttp

  • Vert.x

  • Firefly

但是在这篇文章中,我们不会介绍这些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实例也可以使用构造器创建。

HttpResponse<String> response = client.send(    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>> responseFutures =         IntStream.of(1,2,3,4,5,6,7,8,9,10)  //10个整数形成IntStream,Java 8的语法        .mapToObj(String::valueOf) //10个整数转换成字符串,Java 8的语法        .map(message -> client.sendAsync( //将10个整数字符串作为内容,发送10个异步请求                HttpRequest.newBuilder(TEST_URI)                        .POST(HttpRequest.BodyProcessor.fromString(message))                        .build(),                HttpResponse.BodyHandler.asString()             ).thenApply(HttpResponse::body)  //以CompletableFuture<HttpResponse.body()>作为流处理的返回值        )        .collect(Collectors.toList());  //将Stream转成List

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

sendAsync方法的返回值CompletableFuture<HttpResponse<String>>,使用thenApply(HttpResponse::body) 作了进一步的处理,最终返回值是CompletableFuture<String>。

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

responseFutures.stream().forEach(future -> {    LOGGER.info("Async response: " + future.getNow(null));});

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

三、支持HTTP2的Push-Promise Frames

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

Map<HttpRequest,CompletableFuture<HttpResponse<String>>> responses =        client.sendAsync(    //注意这里只发送一次请求          HttpRequest.newBuilder(TEST_URI)                  .POST(HttpRequest.BodyProcessor.fromString(TEST_MESSAGE))                  .build(),          HttpResponse.MultiProcessor.asMap(    //多个资源的响应结果                  request -> Optional.of(HttpResponse.BodyHandler.asString())          )).join();responses.forEach((request, responseFuture) -> {  LOGGER.info("Async response: " + responseFuture.getNow(null));});

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

关于“Java9对HTTP2协议支持与非阻塞HTTP API实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java9对HTTP2协议支持与非阻塞HTTP API实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Java9对HTTP2协议支持与非阻塞HTTP API实例分析

本文链接: https://www.lsjlt.com/news/324849.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java9对HTTP2协议支持与非阻塞HTTP API实例分析
    这篇文章主要介绍了Java9对HTTP2协议支持与非阻塞HTTP API实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java9对HTTP2协议支持与非阻塞HTTP API实例分析文...
    99+
    2023-06-29
  • Java9新特性对HTTP2协议支持与非阻塞HTTP API
    目录一、HTTP/2简介HTTP/2数据推送目前支持 HTTP/2 的 Java HTTP 客户端二、Java 9 的 HTTP/2 客户端在阻塞模式下发送请求以非阻塞模式发送请求(...
    99+
    2024-04-02
  • Node.js的非阻塞I/O、异步与事件驱动实例分析
    今天小编给大家分享一下Node.js的非阻塞I/O、异步与事件驱动实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作