Java 9中的HTTP / 2支持简介

1.简介

IETF流媒体小组于2015年(即HTTP / 1.1发布后的16年) 批准了HTTP / 2协议。 HTTP / 2有望降低延迟,并且使许多替代方法变得过时,而这些替代方法是HTTP / 1.1所必需的,以便能够满足当今的响应时间要求。 在本文中,我将简要介绍HTTP / 2以及它如何更新基于文本的HTTP / 1.1,然后研究Java 9中即将推出的HTTP / 2支持。

2. HTTP / 1.1的延迟优化技术

人们越来越多地在Internet上住院,但是他们不会注意到,如果响应时间低于100毫秒,那么他们在网络上执行的操作并不是直接由他们自己执行的。

当响应时间达到1秒并引起注意,并且网站响应时间超过10秒时,就被认为是混乱的。 根据一些研究 ,平均注意力跨度已降至7-8秒,即使延迟1秒也可能导致7%的收入损失。

HTTP / 1.1需要(有时很繁重)的变通办法来满足当今的要求。

  • 由于一个HTTP连接一次可以下载一个资源,因此浏览器会同时获取它们,以便能够更快地呈现页面。 但是,每个域的并行连接数是有限的,并且使用域分片来解决该问题。
  • 一种类似的优化技术是将多个资源(CSS,JavaScript)组合到一个包中,以便能够通过单个请求获取它们。 权衡使网络往返的时间减少了,而根本没有使用组装好的资源束中某些部分的风险。 在某些情况下,复杂的服务器端逻辑会负责选择相关的静态资源并将其合并为特定的页面请求
  • 图像精灵是一种类似于将CSS和JavaScript文件捆绑在一起以减少请求数量的技术。
  • 另一种技术的存在是在衬里静态资源HTML

3. HTTP / 2简介

HTTP / 2旨在减轻因维护HTTP / 1.1的复杂基础结构以使其正常运行而引起的痛苦。 尽管HTTP / 2仍与HTTP / 1.1向后兼容,但它不再是基于文本的协议。 客户端将连接建立为HTTP / 1.1请求,然后请求并升级。 从那以后,HTTP / 2在二进制数据帧中对话。

HTTP / 2复用

HTTP / 2复用使上述所有HTTP / 1.1解决方法都已过时,因为单个连接可以处理多个双向流,因此允许客户端同时通过单个连接下载多个资源。

HTTP 1.x协议基于文本,因此很冗长。 有时,一次又一次地交换同一组HTTP标头。 HTTP / 2通过在请求之间维护HTTP标头表,大大减少了所需的带宽。 本质上,这是重复数据删除,而不是传统意义上的压缩。

HTTP / 2推送

您可能会认为HTTP / 2推送是WebSocket的延续或某种升级,但事实并非如此。 WebSocket是在客户端和服务器之间进行全双工通信的一种方法,以便在建立TCP连接后允许服务器将数据发送到客户端,而HTTP / 2则解决了另一个问题。

HTTP / 2推送是关于主动向客户端发送资源,而不必从客户端的角度要求它。 实际上,这意味着服务器端知道一个网站需要一些图像,并且在客户端请求它们之前很长一段时间(一次)将它们全部发送出去。

4.支持HTTP / 2的Java HTTP客户端

根据HTTP / 2的Wiki页面之一,在编写本文时,以下Java客户端库可用于建立HTTP / 2连接。

  • 码头
  • 净额
  • OkHttp
  • Vert.x
  • 萤火虫

但是,在本文中,我们重点关注Java 9提供的HTTP / 2支持。JEP110指定了要求,并且还指出该项目仍处于孵化状态,这实际上意味着该项目将不会取代现有的UrlConnection。 Java 9中的API

仅在Java 10中,标准Java HTTP / 2客户端才会移动到包java.net下 。 但是,与此同时,它将位于jdk.incubtor命名空间下。

5.探索Java 9的HTTP / 2客户端

JEP 110设置了对新的内置HTTP / 2客户端的要求,以便它提供高级,易于使用的API,并且与现有的替代产品相比具有可比的(或更高的)性能(请参见上文)。

第一步是导入模块jdk.incubator.httpclient

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

为了这个示例,我们将使用Undertow作为HTTP / 2兼容的Web服务器。 它只是回显该客户发送给它的消息。

public class EchoServer {private static final Logger LOGGER = Logger.getLogger(EchoServer.class.getSimpleName());private static final int PORT = 8888;private static final String HOST = "localhost";public static void main(final String[] args) {Undertow server = Undertow.builder().setServerOption(UndertowOptions.ENABLE_HTTP2, true).addHttpListener(PORT, HOST).setHandler(exchange -> {LOGGER.info("Client address is: " + exchange.getConnection().getPeerAddress().toString());exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");exchange.getRequestReceiver().receiveFullString((e, m) -> e.getResponseSender().send(m));}).build();server.start();}}

新的API随处都遵循构建器模式,而HttpClient是发起HTTP请求的入口,也不例外。

HttpClient client = HttpClient.newBuilder().version(Version.HTTP_2).build();

以阻止模式发送请求

一旦有了HttpClient实例,也可以使用构建器构造HttpRequest实例。

HttpResponse<String> response = client.send(HttpRequest.newBuilder(TEST_URI).POST(BodyProcessor.fromString("Hello world")).build(),BodyHandler.asString()
);

只要请求得到处理,方法send块就会发送 ,但是也有一种异步交换HTTP消息的方法。

以非阻塞模式发送请求

在下面的示例中,将10个随机整数异步发送到我们的HTTP回显服务器,并且在所有请求都已发起后,主线程等待它们完成。

List<CompletableFuture<String>> responseFutures = new Random().ints(10).mapToObj(String::valueOf).map(message -> client.sendAsync(HttpRequest.newBuilder(TEST_URI).POST(BodyProcessor.fromString(message)).build(),BodyHandler.asString()).thenApply(r -> r.body())).collect(Collectors.toList());CompletableFuture.allOf(responseFutures.toArray(new CompletableFuture<?>[0])).join();responseFutures.stream().forEach(future -> {LOGGER.info("Async response: " + future.getNow(null));
});

处理承诺框架

上面所有示例都可能是常规的老式HTTP / 1.1请求。 除了创建HttpClient之外 ,无法观察到任何特定于HTTP / 2的内容。

客户端API最相关的HTTP / 2功能可能是使用HTTP / 2推送时它处理多个响应的方式。

Map<HttpRequest, CompletableFuture<HttpResponse<String>>> responses =client.sendAsync(HttpRequest.newBuilder(TEST_URI).POST(BodyProcessor.fromString(TEST_MESSAGE)).build(),MultiProcessor.asMap(request -> Optional.of(BodyHandler.asString()))).join();responses.forEach((request, responseFuture) -> {LOGGER.info("Async response: " + responseFuture.getNow(null));
});

六,结论

HTTP / 2对旧的基于文本的协议进行了改进,需要进行很多改进,并使许多令人讨厌的HTTP / 1.1解决方法过时,但它并不能解决所有已知问题。

从Java 9的角度来看,新的HTTP / 2客户端看起来不错,但是,只有在下一个发行版中它才能投入生产。 同时,如果需要HTTP / 2支持,则可以使用上述上述库。

更新: HTTP客户端JEP 312提议对HTTP客户端API进行标准化,该HTTP客户端API是在Java 9中作为孵化API引入的,并在Java 10中进行了更新。从Java 11开始,它是java.net模块的完整功能。

如果您想了解有关Java 9的更多信息,还可以从Java Code Geeks中查看这些Java 9教程 。

翻译自: https://www.javacodegeeks.com/2020/01/introduction-to-http-2-support-in-java-9.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MiUI特色功能设置总结

一 常用设置 【转载于知乎https://www.zhihu.com/question/514792652/answer/2377622710】 1 自动优化系统 其实在手机开发者模式设置中&#xff0c;有2个地方我们需要设置&#xff0c;设置了不仅可以让手机运行更流畅&#xff0c;而且还能帮我们自动优化系统。 &#xff0…

potplayer怎么设置无边框播放,播放时隐藏进度条

potplayer默认情况下播放视频时会显示边框&#xff0c;那么怎么设置无边框播放呢?下面小编就为大家详细的介绍一下&#xff0c;大家感兴趣的话就一起来了解下吧! potplayer怎么设置无边框播放?potplayer设置无边框播放方法 1、点击左上角的potplayer 2、在下拉菜单中点击选项…

蓝牙播放Stereo和Hands-Free AG Audio两种模式的区别?

当使用蓝牙耳机时&#xff0c;发现电脑的播放设备显示了两种模式&#xff08;如下图所示&#xff09;&#xff0c;Stereo模式下声音正常&#xff0c;而调到Hands-Free AG Audio模式下声音频带窄了很多且音质差&#xff0c;典型的电话音&#xff0c;下面具体说说这两种模式的区别…

office工作日志文件_风暴事件处理器–每个工作者的GC日志文件

office工作日志文件在过去的三个月中&#xff0c;我正在与一个新团队合作&#xff0c;为电信领域的大数据分析构建产品。 Storm事件处理器是我们使用的主要框架之一&#xff0c;它确实很棒。 您可以阅读其官方文档中的更多详细信息&#xff08;已改进&#xff09;。 Storm使用…

workrave使用方法

一 模式介绍 阅读模式&#xff1a; 不论电脑什么状态&#xff0c;倒计时一直进行 普通模式&#xff1a; 当检测到电脑没有任何操作&#xff0c;比如打字与移动鼠标&#xff0c;则暂停倒计时。如果长时间没有操作&#xff0c;则默认进入休息状态&#xff0c;下次移动鼠标&…

OpenJDK织机和结构化并发

Project Loom是Hotspot Group赞助的项目之一&#xff0c;旨在向JAVA世界提供高吞吐量和轻量级的并发模型。 在撰写本文时&#xff0c;Loom项目仍处于积极开发中&#xff0c;其API可能会更改。 为什么要织机&#xff1f; 每个新项目可能会出现的第一个问题是为什么&#xff1f;…

在已打开的程序上打开新的窗口

在支持多开的程序上面按shift加鼠标左键&#xff0c;则打开程序新的窗口

Virgo软件的介绍

使用Virgo的场景 Win10自带的虚拟桌面存在BUG&#xff0c;当在第二个虚拟桌面上打开某个软件时&#xff08;如WPS&#xff09;&#xff0c;会自动跳转到打开该应用的第一个窗口。 Virgo介绍 原代码8KB&#xff0c;启用后占用内存1MB&#xff0c;极简桌面 快捷键 ALT 1..4…

java 8 lambda_玩Java 8 – Lambda,路径和文件

java 8 lambda我最近需要读取一堆文件&#xff0c;而不是仅仅抓住我和可能是大多数开发人员拥有的旧FileUtils.java&#xff0c;然后从一个项目复制到另一个项目&#xff0c;我决定快速看看其他方法。 是的&#xff0c;我知道有Commons IO和Google IO &#xff0c;我为什么还要…

设置花里胡哨的Xshell字体与背景颜色(超全)

大部分运维和开发经常接触到的客户端连接工具很多都是Xshell&#xff0c;但是经常看到别人的背景色和字体都是五颜六色&#xff0c;还有护眼色的背景&#xff08;想必大家也会遇到在深夜加班时为了不打扰身边小伙伴的休息不开灯&#xff0c;打开Xshell时可以闪瞎人眼的白色背景…

Jakarta EE贡献–入门

您是否有兴趣帮助Jakarta EE向前发展&#xff1f; 我也是。我想提供一些详细信息&#xff0c;以帮助有兴趣入门的人。 步骤1&#xff1a; 开始捐款的第一步是签署Eclipse Foundation Committer and Contributor Agreement&#xff08;ECA&#xff09;&#xff1a; https : //…

Ubuntu “sudo apt-get update”报错

一 sudo apt-get update作用 从服务器拉取可用的包到本地 二 出错情况 Ign:9 https://download.sublimetext.com apt/stable/ Packages Ign:10 https://download.sublimetext.com apt/stable/ Translation-en_US Ign:11 https://download.sublimetext.com apt/stable/ Transl…

dpkg:错误:无法新建文件 ‘/var/lib/dpkg/info/format-new’: 没

错误 dpkg&#xff1a;错误&#xff1a;无法新建文件 ‘/var/lib/dpkg/info/format-new’: 没有那个文件或目录 E: Sub-process /usr/bin/dpkg returned an error code (2) 解决方法 1.尝试去查看没有那个文件或目录 2.逐级进入目录&#xff0c;返现没有的是 info 3.用root权限…

add-apt-repository命令详解

该命令是通过PPA源方式安装软件的添加PPA源到Source list中的命令&#xff0c;该软件安装方式的流程为&#xff1a; 1.搜索PPA软件源&#xff0c;如在Google上软件名称关键字 PPA &#xff0c;或者也可直接到 launchpad.net 上搜索2.sudo apt-add-repository ppa_source_name…

过度配置堆上的OutOfMemoryError

在分配一个应该很适合我为JVM提供的堆中的数据结构时&#xff0c;为什么会出现OutOfMemoryError&#xff1f; 这是我最近遇到的一个问题。 确实&#xff0c;当查看开发人员要完成的工作并通过-Xmx参数对提供给JVM的堆大小进行三重检查时&#xff0c;似乎确实存在着一些可疑之处…

E: Couldn‘t find any package by regex ‘python3.6‘的解决方式

一 问题描述 安装python较高版本。按照网上提供的参考资料&#xff0c;运行相关命令 sudo apt-get install python-software-properties sudo apt-get install software-properties-common sudo add-apt-repository ppa:jonathonf/python-3.6 sudo apt-get update sudo apt…

如何在Java中修复表达式的非法开头

您是否遇到过这个令人难以置信的错误&#xff0c;想知道如何解决它&#xff1f; 让我们浏览一下这篇文章&#xff0c;研究如何解决表达式Java非法开头错误。 这是一个动态错误&#xff0c;这意味着编译器会发现某些不符合Java编程规则或语法的内容。 初学者大多会遇到Java中的…

apt-cache 命令

一 命令介绍 apt-cache 命令可显示 APT 内部数据库里的多种信息。这些信息是从 sources.list 文件内聚集不同来源的缓存。于运行 apt update 运作时产生的。 APT包管理器工作在软件包元数据的本地缓存上。通过apt-cache命令&#xff0c;可以查询本地APT缓存并获得相关信息。 …

apt-get install 和pip install 、 apt与apt-get之间的区别 的区别

1 apt-get install 和pip install 的区别 区别&#xff1a; pip install 主要安装pypi上已经上传的包或库&#xff0c;主要和编程语言python 有关的包&#xff0c;可以选择版本&#xff0c;或者在已有的新版本上安装旧版本sudo apt-get install 是用于系统升级下载相关的软件…

Ubuntu下环境变量

一 环境变量是什么 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:临时文件夹位置和系统文件夹位置等。简单理解:就是系统运行时所需要的一些参数。