HTTP2:内部服务 api 是否应该使用 http2
HTTP2: Should inner service apis use http2
我使用的是微服务架构,其中一个服务一次调用多个服务,服务器在 nodejs 上
我计划将 HTTP2 用于从一项服务到另一项服务的 API 调用,因为它仅使用一个具有 header 压缩的 TCP 连接。
但是,HTTP2 需要 TLS 支持,这意味着每次 API 服务向其他人发出的调用都会进行一次 TLS 握手,从而增加开销往返。
虽然 TLS1.3 只需要一个往返,但它仍然增加了一些额外的开销时间。
我的问题是,从一项服务到另一项服务的 API 调用首先使用 HTTP2 是个好主意,还是最好继续使用 HTTP1.1
HTTP2 很可能不会比普通的 HTTP1.1 性能更高。当您在 HTTPS 和并行请求的上下文中比较它们时,它只会更快。 HTTP2 允许重复使用相同的 TLS 握手,以及对多个 parallel 请求(多路复用)使用相同的连接。
这就是您不设置 HTTP2 between nginx and your app server 的原因 - 因为它们之间通常不需要 TLS。因此,除非 a) 您需要在服务之间建立安全连接,并且 b) 您计划发出并行请求 - 使用 HTTP2 进行服务到服务通信似乎没有意义。
PS:另请阅读@sbordet 的回答 - 似乎有一些用例,即使没有 TLS,HTTP2 也是有益的。
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 个连接一样(这些只是浏览器限制,并不适用到服务器到服务器的通信)。
此外,使用 HTTP/2 功能(例如 HTTP/2 推送(尽管现在已被淘汰))的后端应用程序将使用纯 HTTP/2 通信透明地工作,但不会在使用 HTTP/1 与后端通信时能够使用 HTTP/2 功能。
对于任何其他 HTTP/2 功能都是如此,例如 PING 帧、SETTINGS 帧等。在使用 HTTP/1.
与后端应用程序通信时,所有这些都会丢失。
从资源的角度来看,智能反向代理或负载均衡器可以卸载 TLS,然后盲目地将 HTTP/2 明文字节转发到后端——无需解释任一方向的字节。
不需要解析 HTTP/2 请求,将其转换为 HTTP/1 格式,反之亦然,当收到 HTTP/1 响应时(从 HTTP/1 到 HTTP/2) .
这会导致不必要的 CPU 燃烧和 TCP 连接使用。
所以,原则上HTTP/2向后端发展是非常可取的。
我曾经使用过集群系统,其中 HTTP/2 用于服务器到服务器的通信是一个巨大的好处,只是因为整个集群使用的资源要少得多。
然而,现实是最流行的前端服务器不支持 HTTP/2 后端(主要是出于非技术原因),所以大多数时候你只需要放弃并部署次优系统。
我使用的是微服务架构,其中一个服务一次调用多个服务,服务器在 nodejs 上
我计划将 HTTP2 用于从一项服务到另一项服务的 API 调用,因为它仅使用一个具有 header 压缩的 TCP 连接。
但是,HTTP2 需要 TLS 支持,这意味着每次 API 服务向其他人发出的调用都会进行一次 TLS 握手,从而增加开销往返。
虽然 TLS1.3 只需要一个往返,但它仍然增加了一些额外的开销时间。
我的问题是,从一项服务到另一项服务的 API 调用首先使用 HTTP2 是个好主意,还是最好继续使用 HTTP1.1
HTTP2 很可能不会比普通的 HTTP1.1 性能更高。当您在 HTTPS 和并行请求的上下文中比较它们时,它只会更快。 HTTP2 允许重复使用相同的 TLS 握手,以及对多个 parallel 请求(多路复用)使用相同的连接。
这就是您不设置 HTTP2 between nginx and your app server 的原因 - 因为它们之间通常不需要 TLS。因此,除非 a) 您需要在服务之间建立安全连接,并且 b) 您计划发出并行请求 - 使用 HTTP2 进行服务到服务通信似乎没有意义。
PS:另请阅读@sbordet 的回答 - 似乎有一些用例,即使没有 TLS,HTTP2 也是有益的。
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 个连接一样(这些只是浏览器限制,并不适用到服务器到服务器的通信)。
此外,使用 HTTP/2 功能(例如 HTTP/2 推送(尽管现在已被淘汰))的后端应用程序将使用纯 HTTP/2 通信透明地工作,但不会在使用 HTTP/1 与后端通信时能够使用 HTTP/2 功能。 对于任何其他 HTTP/2 功能都是如此,例如 PING 帧、SETTINGS 帧等。在使用 HTTP/1.
与后端应用程序通信时,所有这些都会丢失。从资源的角度来看,智能反向代理或负载均衡器可以卸载 TLS,然后盲目地将 HTTP/2 明文字节转发到后端——无需解释任一方向的字节。 不需要解析 HTTP/2 请求,将其转换为 HTTP/1 格式,反之亦然,当收到 HTTP/1 响应时(从 HTTP/1 到 HTTP/2) . 这会导致不必要的 CPU 燃烧和 TCP 连接使用。
所以,原则上HTTP/2向后端发展是非常可取的。
我曾经使用过集群系统,其中 HTTP/2 用于服务器到服务器的通信是一个巨大的好处,只是因为整个集群使用的资源要少得多。
然而,现实是最流行的前端服务器不支持 HTTP/2 后端(主要是出于非技术原因),所以大多数时候你只需要放弃并部署次优系统。