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