关于 Web 浏览器中的 gRPC 支持以及它们如何利用 HTTP2 的问题
Posted
技术标签:
【中文标题】关于 Web 浏览器中的 gRPC 支持以及它们如何利用 HTTP2 的问题【英文标题】:Questions about gRPC support in web browsers and how they utilize HTTP2 【发布时间】:2021-04-25 15:32:38 【问题描述】:在发现 gRPC 后,我偶然发现了this blog post
为什么不是每个人都已经在他们的 SPA 中使用 gRPC?
传统上不可能从基于浏览器的 gRPC 中使用 应用程序,因为 gRPC 需要 HTTP/2,并且浏览器不暴露 任何让 JS/WASM 代码直接控制 HTTP/2 请求的 API。
但是有一个解决方案! gRPC-Web 是 gRPC 的扩展,它使 它与基于浏览器的代码兼容(从技术上讲,这是一种 通过 HTTP/1.1 请求执行 gRPC)。 gRPC-Web 尚未普及 但是因为没有多少服务器或客户端框架提供支持 为它……直到现在。
自 3.0 版本以来,ASP.NET Core 提供了出色的 gRPC 支持。和 现在,在此基础上,我们即将提供预览支持 服务器和客户端上的 gRPC-Web。如果你想深入了解 详细信息,这是来自 James Newton-King 的出色拉取请求 全部实现的地方。
这里有一些很好的信息,但这篇文章现在已经有一年了。
最近还有一些使用 .NET 和 Blazor 技术的重大推动 from Microsoft。
看起来grpc-web 维护得很好,并且总是添加很多语言支持,所以这是值得关注的事情......但据我了解,grpc-web 仍然是为在 HTTP1.1 上运行而构建的?
对我来说,另一个问题仍然存在为什么浏览器 API 不支持 HTTP2,我找不到任何文档。
我很想开始使用 gRPC,但我也担心它可能带来的缺点。
感谢您对我缺乏理解的任何解释。
请注意,关于这个here,SO 上有一个稍微相关的问题,其答案并不完全全面且较旧。
【问题讨论】:
【参考方案1】:我在我的项目中使用了 grpc,并且了解您对此的疑问。前两个问题可以通过 grpc.io 的引用和一些详细说明来回答。
- 对我来说,另一个问题仍然存在,为什么 HTTP2 不是 通过浏览器 API 支持,我找不到任何 文档。
- 看起来 grpc-web 维护得很好,并且总是添加一个 很多语言支持,所以这是需要注意的事情......但是 据我了解,grpc-web 仍然可以通过 HTTP1.1 运行?
目前无法实现 HTTP/2 gRPC spec3 浏览器,因为根本没有足够细粒度的浏览器 API 控制请求。例如:没有办法强制 使用 HTTP/2,即使有,原始 HTTP/2 帧也是 在浏览器中无法访问。 gRPC-Web 规范从以下点开始 HTTP/2 规范的视图,然后定义差异。 quote reference
- 我很想开始使用 gRPC,但我也担心 可能会带来的缺点。
我也想谈谈这个话题。为什么要使用 gRPC?这和 Http2 和 gRPC 的速度有关吗? Http1.1是老技术吗? 今天,REST 协议适用于 Http1.1。如果他们开始使用Http2.0,这些接口不会有任何变化。此外,如果您不使用流式传输,REST 比 gRPC 更快。 gRPC 在速度方面具有更好的优势。
下面,我从 GRPC-WEB 链接了支持的 RPC 类型
【讨论】:
那篇文章正是我想要的。感谢您的见解。你知道为什么不能强制 HTTP/2 或者为什么不暴露原始 HTTP/2 帧吗?从浏览器的角度来看,这是一个安全问题,还是只是浏览器缺乏开发(无论出于何种原因)?似乎 gRPC Web 不值得额外的迁移开销(至少在代理端) “老实说,我没有关于 Http/2 安全性的详细知识。” 五月,你可以在 *** 上问一个关于这个的新问题。 完全不清楚为什么“REST 比 gRPC 更快”,因为 REST 根本没有正式定义。它更像是一种“哲学”,或者一种概念。换句话说,几乎不可能仅凭性能方面的想法来比较具体的协议及其实现。 @tosh 如果你比较 Http1.1 和 Http2.2 协议,你可以发现速度问题。特别是查看确认状态。 grpc 也可以在单个 tcp 上传输数据,但这对于 Rest 是不可能的。如果我们对 Streaming 进行测试,我们也可以检测到这个问题。 我不确定我是否理解您在说什么。 REST 和 gRPC 都可以再次在 HTTP 1 和 2 上工作。我也不明白 Http2.2 是什么——如果我们谈论的是超文本传输协议,那么就没有这样的东西(和 Http 2.1以及)- 只有 HTTP/2以上是关于关于 Web 浏览器中的 gRPC 支持以及它们如何利用 HTTP2 的问题的主要内容,如果未能解决你的问题,请参考以下文章