可视化 gRPC 语言堆栈
这里是对 gRPC 堆栈的高级概述。gRPC 支持的 10 种默认语言中的每一种都有多个层,允许您自定义应用程序中所需的组件。
gRPC 中有三个主要的堆栈:C 核心、Go 和 Java。大多数语言都是基于 C 的 gRPC 核心库之上的薄封装。
封装的语言
例如,Python 应用程序调用生成的 Python 存根。这些调用通过拦截器,并进入封装库,其中调用被转换为 C 调用。gRPC C 核心将 RPC 编码为 HTTP/2,可以选择使用 TLS 加密数据,然后将其写入网络。
gRPC 的一个很酷的地方是您可以替换这些组件。例如,您可以使用 C++,并使用进程内传输。这样可以避免您必须一直下降到操作系统网络层。另一个例子是尝试使用 QUIC 协议,它可以让您快速打开新连接。能够根据环境在各种传输上运行使得 gRPC 非常灵活。
对于每种封装的语言,默认的 HTTP/2 实现都构建在 C 核心库中,因此无需包含外部实现。但是,如您所见,可以自带实现(例如使用 Cronet,即 Chrome 网络库)。
Go
在 gRPC-Go 中,由于不必支持如此多的配置,堆栈要简单得多。这里是 Go 堆栈的高级概述
这里的结构略有不同。由于只有一种语言,从堆栈顶部到底部的流程更加线性。与封装的语言不同,gRPC Go 可以使用其自己的 HTTP/2 实现,也可以使用 Go net/http
包。
Java
这里是 gRPC-Java 堆栈的高级概述
同样,结构略有不同。Java 支持 HTTP/2、QUIC 和进程内,就像 C 核心一样。但是,与 C 核心不同,应用程序通常可以绕过生成的存根和拦截器,直接与 Java 核心库对话。每个结构都根据 gRPC 的每种语言实现的需求而略有不同。此外,与封装的语言不同,gRPC Java 将 HTTP/2 实现分离到可插拔的库中(例如 Netty、OkHttp 或 Cronet)。