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

立即学习“Java免费学习笔记(深入)”;

目前支持 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 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> 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作为流处理的返回值        )        .collect(Collectors.toList());  //将Stream转成List

登录后复制

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

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

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>> 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看起来不错。但笔者觉得目前相关技术的使用还不是很成熟,我觉得大家暂时尝尝鲜就可以。

以上就是Java 9的HTTP2协议支持和非阻塞HTTP API分析的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3044858.html

(0)
上一篇 2025年3月13日 15:40:29
下一篇 2025年3月8日 09:41:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • java高级用法之JNA中的回调问题怎么解决

    简介 什么是callback呢?简单点说callback就是回调通知,当我们需要在某个方法完成之后,或者某个事件触发之后,来通知进行某些特定的任务就需要用到callback了。 最有可能看到callback的语言就是javascript了,…

    编程技术 2025年3月13日
    200
  • Spring中的注解总结和简单应用介绍

    本篇文章给大家带来的内容是关于spring中的注解总结和简单应用介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1. @Controller 标识一个该类是Spring MVC controller处理器,用来创建处理…

    编程技术 2025年3月13日
    200
  • Exception与Result的介绍(代码示例)

    本篇文章给大家带来的内容是关于exception与result的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在分布式系统开发中,我们经常需要将各种各样的状态码、错误信息传递给最外层的调用方,这个调用方通…

    编程技术 2025年3月13日
    200
  • 怎么获取json中的数据

    json是首先一种数据结构,说白了就是对数据的描述,刚刚出现是为了取代xml,可惜并没有,但是在作为配置文件上,却是很好,由于它小巧灵活,描述数据很好,所以在网络上进行数据传输更加方便。 请记住json对数据的描述形式,既然是形式,那么它的…

    2025年3月13日
    200
  • java中怎么创建索引

    java中创建索引的方法:首先把对象转换为JSON字符串;然后把json文档写入索引;最后使用Java代码新建一个Java项目,在其中写好创建索引代码调用就可以了。 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包…

    2025年3月13日
    200
  • jq是指什么?

    json 是一种轻量级的数据交换格式。jq 是一款命令行下处理 json 数据的工具。下面我将给大家详细介绍一下jq,感兴趣的朋友可以了解一下。 json采用完全独立于语言的文本格式,具有方便人阅读和编写,同时也易于机器的解析和生成。 这些…

    2025年3月13日
    200
  • Java中使用构造函数与使用setter的效率差别

    在对java代码进行优化的时候,想方设法的要提高整体的效率,使用jprofiler看代码的时间占比,然后,看看哪些部分是可以优化的,减少运行时间的。下面有这么几个方向。 1,能使用构造函数一步到位的,就尽量使用构造函数,而不是使用一个个se…

    2025年3月13日 编程技术
    200
  • php json_encode如何使用

    现在的接口开发,xml格式的已经很少了,大部分都被json取代了,而php号称专为接口开发的语言,自然有它强大的特点,那就是它的内置函数json_encode. 函数原型为 function json_encode($value,$opti…

    2025年3月13日
    200
  • java判断是否json格式

    java判断是否json格式 JsonObject和JsonArray对象都没有能快速判断json格式合法性的方法,只好使用捕获异常的方式判断json合法性。 代码如下: /** * 判断是JsonObject * @param obj *…

    2025年3月13日
    200
  • java读取json数据中文乱码解决

    java读取json数据出现乱码的代码:(推荐:java视频教程) //从json文件中读取数据StringBuffer stringBuffer = new StringBuffer();try {BufferedReader buffe…

    2025年3月13日
    200

发表回复

登录后才能评论