【问题标题】:HTTP2: Should inner service apis use http2HTTP2:内部服务 API 是否应该使用 http2
【发布时间】:2022-01-13 22:54:35
【问题描述】:

我使用的是微服务架构,其中一个服务一次调用多个服务,服务器在 nodejs 上

我计划将 HTTP2 用于从一项服务到另一项服务的 API 调用,因为它仅使用一个带有标头压缩的 TCP 连接。

但是,HTTP2 需要 TLS 支持,这意味着服务向其他人发出的每个 API 调用都要进行 TLS 握手,从而增加了往返开销。

虽然 TLS1.3 只需要一次往返,但它仍然会增加一些额外的开销时间。

我的问题是,从一个服务到另一个服务的 API 调用首先使用 HTTP2 是个好主意,还是继续使用 HTTP1.1 更好

【问题讨论】:

    标签: node.js http ssl microservices http2


    【解决方案1】:

    HTTP2 很可能不会比普通的 HTTP1.1 性能更高。只有在 HTTPS 和并行请求的上下文中比较它们时才会更快。 HTTP2 允许重复使用相同的 TLS 握手,以及对多个并行请求(多路复用)使用相同的连接。

    这就是您不设置 HTTP2 between nginx and your app server 的原因 - 因为您通常不需要它们之间的 TLS。因此,除非 a) 您需要在服务之间建立安全连接,并且 b) 您计划发出并行请求 - 使用 HTTP2 进行服务到服务通信似乎没有意义。

    PS:另请阅读@sbordet 的答案 - 即使没有 TLS,HTTP2 似乎也有好处。

    【讨论】:

      【解决方案2】:

      HTTP/2 不需要 TLS 支持。

      碰巧所有浏览器供应商(而且只有他们)决定不支持明文 HTTP/2,但其他客户端,如 curl,或 Java 客户端等确实支持明文 HTTP/2 .

      但是,对于服务器到服务器的通信,可以使用明文 HTTP/2,实际上这是一种非常常见的部署。

      不幸的是,用作反向代理或负载平衡器的流行服务器不支持使用 HTTP/2 调用后端,但这只是一个实现限制。

      HAProxy,例如,允许卸载 TLS,然后使用明文 HTTP/2 调用后端。

      如果您在前端收到许多多路复用请求,您可以在后端利用 HTTP/2 多路复用,从而节省大量资源。 向前端请求 30 个多路复用资源的网页在使用 HTTP/1 时需要打开或以其他方式使用 30 个到后端的不同连接(或更少的连接且效率较低),而在使用时仅使用 1 个HTTP/2。 在后端使用 HTTP/2 时,您不仅限于 1 个连接,就像使用 HTTP/1 时不限于仅使用 6 个连接一样(这些只是浏览器限制,不适用于 server-to -服务器通信)。

      此外,使用 HTTP/2 功能(例如 HTTP/2 推送)的后端应用程序(尽管现在已被逐步淘汰)可以使用纯 HTTP/2 通信透明地工作,而无法使用 HTTP/2向后端使用 HTTP/1 通信时的功能。 这适用于任何其他 HTTP/2 功能,例如 PING 帧、SETTINGS 帧等。在使用 HTTP/1 与后端应用程序通信时,所有这些功能都会丢失。

      从资源的角度来看,智能反向代理或负载均衡器可以仅卸载 TLS,然后盲目地将 HTTP/2 明文字节转发到后端——无需解释其中的字节方向。 在接收到 HTTP/1 响应(从 HTTP/1 到 HTTP/2)时,不需要解析 HTTP/2 请求,将其转换为 HTTP/1 格式,反之亦然。 这会导致不必要的 CPU 消耗和 TCP 连接使用。

      因此,原则上 HTTP/2 面向后端是非常可取的。

      我曾使用过集群系统,其中用于服务器到服务器通信的 HTTP/2 是一个巨大的好处,只是因为整个集群使用的资源更少。

      然而,现实情况是,最流行的前端服务器不支持后端的 HTTP/2(主要是出于非技术原因),所以大多数时候你只能放弃并部署次优系统。

      【讨论】:

      • 我曾使用过集群系统,在这些系统中,用于服务器到服务器通信的 HTTP/2 是一个巨大的好处,只是因为整个集群使用的资源更少。 - 可以您发布了您的发现和在这两种情况下使用的设置?
      • 我无法公布数字,但集群属于“每个节点都连接到每个节点”类型的集群。所以每个节点都有 N 个传入和 N 个传出。对于 HTTP/1,您希望有一些并行性,因此将它们乘以 M,而对于 HTTP/2,您依赖于多路复用。 HTTP/2 系统使用的连接数减少了 M 倍,这意味着在操作系统级别和 JVM 级别(是的,使用 Java)的 I/O 负载更少,从而大大减少了延迟等。级联的好处。当然这不是一个常见的用例,但它显示了服务器到服务器中的 HTTP/2 是多么理想。
      • 一个因子 M 更少的连接,这意味着在操作系统级别和 JVM 级别的 I/O 负载更少 - 这个负载与什么有关?我的意思是,拥有 M 个连接本身不应该增加额外的流量(除了初始握手然后保持活动状态)。而不是操作系统执行 TCP/IP 路由,您的应用服务器将执行多路复用逻辑,因此您似乎也不会在这里获胜。至于内容本身,虽然 HTTP2 由于二进制性质而压缩了其中的一部分,但它还再次添加了额外的标头以支持多路复用。
      • 这不仅仅与网络流量有关。这与连接数有关。必须为 HTTP/1 管理 NxM 连接,而为 HTTP/2(或 Nxm,其中 m
      猜你喜欢
      • 2018-01-28
      • 2018-01-17
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2016-06-13
      • 2021-03-19
      • 2017-08-23
      相关资源
      最近更新 更多