可视化 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)。