作为开发人员,我们的主要目标一直是为我们的产品用户提供更快,更无缝的体验。 不断提高生产力和体验的渴望促使我们几乎不断地升级技术。 我们迁移到语言,Web框架,消息传递队列以及文本处理器和操作系统的较新版本。 但是不知何故,Web应用程序普遍使用的基本协议HTTP协议错过了十多年的升级。
HTTP / 1.1很棒,但是随着Web应用程序的规模和复杂性的增长,它的年龄正在开始显现。 这是升级到HTTP / 2的绝佳时机。
HTTP / 1.2发生了什么?
新HTTP的目标设定了很高的目标,并且为了实现这些指标,网络中数据的传输方式发生了根本性的变化。 HTTP / 2引入了新的二进制框架层,该层打破了与HTTP / 1.x客户端和服务器的向后兼容性。 因此,版本控制跳至2.0。
这个新的二进制框架层是什么?
这是一个简单的设计选择。 HTTP / 1.x传统上使用换行符分隔的文本来传输数据。 与二进制文件相比,它更慢,更大并且更容易出错。 因此,HTTP / 2在传输层切换为二进制格式。
这是指在套接字和我们从应用程序公开的HTTP API之间(而不是API本身)之间如何编码数据的设计更改。 将运行应用程序的Web容器将根据其支持的HTTP版本来完成这种编码,而无需对API层进行任何更改。
语义仍然相同。 您仍然可以像在HTTP 1.x中一样使用传统的GET,PUT,POST,DELETE。
我的主要好处是什么?
在不详细介绍二进制流如何工作的情况下,让我们用以下一条语句对其进行总结,然后继续介绍它如何为我们提供帮助:
HTTP / 2将HTTP协议通信分解为交换二进制编码的帧,然后将其映射到属于特定流的消息,所有这些消息都在单个TCP连接中进行多路复用。
现在,来谈谈好处:
1,二进制处理:二进制内容更快,更轻,更紧凑。 HTTP / 2仅有一个,而不是在HTTP / 1.x中具有四个不同的消息解析选项。 同样,二进制内容为处理大写字母,空格,空白行和其他难以在文本中体现的概念提供了更多支持。
2.复用:HTTP / 1.x的基本原理是每次只能传递一个响应。 这导致响应排队和阻塞,从而减慢了TCP连接的速度。 这意味着到目前为止,客户必须猜测需要获取的正确响应顺序才能快速处理事务。
HTTP / 2取消了这个概念,新的二进制流使完整的请求和响应多路复用成为可能。 因此,客户端只需要每个源一个连接就可以并行传递多个请求和响应,而彼此之间不会相互阻塞。 反过来,这可以消除不必要的延迟并提高可用网络容量的利用率,从而缩短页面加载时间。
3.标头压缩:HTTP / 2使用HPACK压缩技术来跨请求和响应压缩标头数据。
HPACK使用霍夫曼编码压缩标头,而客户端和服务器维护以前看到的标头列表,以加快编码和解释速度。 在当今的平均请求中,我们可以看到标头跨越了数千KB的Cookie,并且标头压缩大大提高了效率。
4.服务器推送:在HTTP / 1.x中,服务器仅在对客户端发出请求时才能与客户端通信,并且只能通过响应该特定请求进行通信。 但是,在HTTP / 2中,服务器可以将多个响应发送到单个请求。 因此,除了响应外,服务器还可以将其他有用信息推送到客户端。 例如,在加载网页时,服务器可以立即开始发送javascript文件和样式表,而无需等待客户端要求它们。 它还可以用于活动更新客户端的缓存,以更快地进行渲染。
如何移至HTTP / 2?
由于获得了如此多的好处,组织一直在稳步向HTTP / 2迈进,其使用量不断增加。 截至目前,所有网站中有32.4%使用HTTP / 2。 业界有信心这个数字只会上升。 那么,您如何跳上这列火车?
如前所述,无需更改应用程序层即可过渡到HTTP / 2,因为更改是在编码和信息传输机制中进行的。
如果您使用的是cURL,只需使用以下命令检查当前版本
curl --version
您将收到以下协议列表:dict文件ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp。 如果您未在其中看到http2,则只需更新cURL版本。
Mac用户可以轻松完成
brew reinstall curl --with-openssl --with-nghttp2
对于其他操作系统,您可以阅读这篇有用的文章。
现在如何更新Web服务器和容器? 每个人都有一个略有不同,但非常简单且最小的更改即可进行升级,而且与现有代码的兼容性没有问题。
我主要将Spring Boot用于我的应用程序。 它具有一个嵌入式的tomcat服务器,该服务器自1.4.x版本开始支持HTTP / 2,该版本具有Tomcat 8.5.x版本。 我们需要做的就是将HTTP 2升级协议添加到Tomcat的连接器中。 我们可以通过定制嵌入式Tomcat容器来做到这一点:
@Beanpublic EmbeddedServletContainerCustomizer tomcatCustomizer() { return (container) -> { if (container instanceof TomcatEmbeddedServletContainerFactory) { ((TomcatEmbeddedServletContainerFactory) container) .addConnectorCustomizers((connector) -> { connector.addUpgradeProtocol(new Http2Protocol()); }); } };}
就这么简单!
现在,所有流行的Web框架都支持HTTP / 2,并且迁移非常简单,并为我们提供了许多好处,可以为用户提供更好的体验。 我希望本文能向您介绍HTTP / 2迁移的方向。
(本文翻译自Arindam Roy的文章《Migrating your REST APIs to HTTP/2: Why and How?》,参考:https://blog.usejournal.com/migrating-your-rest-apis-to-http-2-why-and-how-8caee7d798fb)