首页
/ gRPC Core 架构完全解读:走进 gRPC C++ 核心库的设计蓝图

gRPC Core 架构完全解读:走进 gRPC C++ 核心库的设计蓝图

2026-09-08 17:06:51作者:庞队千Virginia

gRPC Core 是 gRPC 生态中承载全部底层能力、以 C++ 实现的共享核心库,本仓库中 C++、Python、Ruby、Objective-C、PHP、C# 等语言绑定均构建于其上。本文将系统拆解 src/core/AGENTS.md 所定义的 Core 架构全貌,带领读者掌握 Channel/Call、Transport、Filter、Promise、Event Engine 等关键抽象及其分工,并结合各子系统的 AGENTS 文档与源码给出可继续深入阅读的完整地图。

一、定位:什么是 gRPC Core

gRPC Core 是一个以 C++ 编写、可移植且高性能的 gRPC 协议实现库。仓库 src/core/README.md 明确指出:它通过一个底层(low-level)API 提供 gRPC 的全部核心功能,而仓库中其他语言(C++、Python、Ruby、Objective-C、PHP、C#)的 gRPC 库都是构建在这个共享 Core 之上的。也就是说,无论你在上层使用哪种语言,真正负责网络传输、连接管理、RPC 生命周期、安全握手与负载均衡的,都是这份 C++ Core 代码。

本仓库的顶层 src/core/AGENTS.md 就是这份核心库的“架构导览”:它先概括五个关键概念(Channels and Calls、Transports、Filters、Promises、Event Engine),再给出全局编码风格约束,最后按目录逐一列出各子系统及其对应的深入文档。本文的骨架即取自这份文档,并向下层源码做纵深展开。

二、五大核心概念

1. Channel 与 Call:连接与一次 RPC 的抽象

  • Channel:代表与某个 gRPC 服务之间的连接,是客户端的入口对象;
  • Call:代表单次 RPC,承载一次调用的完整生命周期。

管理 Call 生命周期的基础数据结构集中在 src/core/call/AGENTS.md 描述的 call 目录中,该目录也被称为 gRPC C++ Core 的“心脏”。这里值得展开:Call 的实现正在经历一次重大演进,代码库中并存两代模型:

维度 Call V1(传统栈) Call V3(新栈)
接口实现类 FilterStackCallfilter_stack_call.h 客户端 ClientCallclient_call.h)与服务端 ServerCallserver_call.h
并发模型 Combinercombiner.h)与 WorkSerializerwork_serializer.h gRPC Promise 库,核心是 Partyparty.h
配套传输层 CHTTP2、Legacy InProc PH2、Chaotic Good、InProc
创建入口 grpc_call_create MakeClientCall / MakeServerCall

其中 Call V3 的中枢组件是 CallSpinecall_spine.h),它封装了调用的上下文——包括 arena 分配器、call filters、用于消息与元数据通信的 pipe,并被 CallInitiator(客户端视角)与 CallHandler(服务端视角)共享。元数据从 CallInitiator 流入 spine 时,spine 会先执行 filter 钩子再到达 CallHandler;响应消息与响应元数据则反向流经 filters 回到 CallInitiatorClientCallServerCall 是面向应用层的公共 API,分别包装 CallInitiator/CallSpineCallHandler/CallSpine

下图展示了 Call V3 的堆栈结构(图片出处见 src/core/call/AGENTS.md):

gRPC Core Call V3 调用堆栈架构图

2. Transport:负责网络收发的传输抽象

Transport 负责在网络上收发数据。gRPC Core 支持多种传输实现:CHTTP2(线上主用)、InProc(进程内)、以及实验性的 "Chaotic Good" 传输。src/core/transport/AGENTS.md 说明:核心传输抽象是 grpc_endpoint_transport 接口(endpoint_transport.h),它统一负责流控、多路复用与错误处理;配套还有表示连接安全上下文的 grpc_auth_contextauth_context.h),以及以 endpoint transport 为后端的客户端通道工厂。该接口刻意设计为可扩展——新增传输实现只需实现该接口即可接入。

各具体传输的深入文档位于:

3. Filter:拦截与修改 RPC 的机制

Filter 用于拦截并修改流经 channel 的 RPC,认证(authentication)、压缩(compression)、重试(retry)等大量特性都由 filter 实现。其基础设施文档见 src/core/filter/AGENTS.md:该目录定义了 filter 必须实现的接口与按正确顺序调用的执行机制。要点包括:

  • FilterArgsfilter_args.h):向 filter 传递与 channel args 无关的参数(例如 filter 的实例 ID);
  • Fused Filters:一项实验性优化,允许把多个 filter 融合为一个,降低 filter 链开销,特别适合本身极简、低开销的 filter(实现见 fused_filters.cc);
  • 认证相关 filter 位于其 auth 子目录
  • Filter 以“栈”形式组织,栈中每个 filter 可以把 RPC 交给下一个 filter,也可以直接终止 RPC。

具体到各种业务 filter(HTTP 编解码、消息压缩、消息大小限制、RBAC 鉴权、fault injection、日志等)的实现分散在 src/core/ext/filters/AGENTS.md 体系内(该目录下每个功能子目录均配有同名 AGENTS 文档,如 ext/filters/http/AGENTS.mdext/filters/rbac/AGENTS.md)。需要特别注意的是,client_channel 内部正处于“传统动态 filter”向“基于 Promise 的 interceptor”迁移的阶段(见下文)。

4. Promise:异步编程框架

Promise 是 gRPC Core 内部广泛使用的异步编程框架,用于实现非阻塞 I/O 及其他异步操作。完整设计见 src/core/lib/promise/AGENTS.md,这里列出最关键的组件:

  • Promise<T>promise.h):本质是返回 Poll<T> 的 functor。多数代码不会直接用裸 Promise<T>,因为它经过类型擦除、会引入间接函数调用与额外内存分配;
  • Poll<T>poll.h):promise 的返回类型,取值要么是 Pending,要么是携带 T 值的 Ready
  • Activityactivity.h):promise 的执行上下文,负责把 promise 运行到完成,并在挂起 promise 可以继续推进时唤醒它;
  • Partyparty.h):用于“并发(concurrently)但非并行(not parallelly)”地执行多个 promise 的调度工具;
  • 组合子(combinators)If/Switch(条件)、Join/TryJoin/AllOk(汇合)、Loop/ForEach(循环)、MapMatchRace/PrioritizedRace(竞速,注意所有被竞速的 promise 必须解析为同一类型)、Seq/TrySeq(顺序执行)等,均可安全嵌套、自由组合;
  • 同步原语:库明确区分“activity 内”与“activity 间”两类同步:latch.hpromise_mutex.h 用于单个 activity 内部;inter_activity_latch.hinter_activity_mutex.h 用于不同 activity 之间。使用错误的一类原语可能导致死锁
  • 其他设施:pipe.h(同 activity 内通信)、inter_activity_pipe.h(跨 activity 通信)、mpsc(多生产者单消费者队列)、SleepWaitForCallbackWaitSetObservableArenaPromise<T>(arena 分配、已标记 deprecated,新代码不应使用)等。

call 目录(Call V3)重度依赖此 Promise API,因此在阅读 Call V3 代码前先熟悉 Promise 库是官方文档给出的前提条件。

5. Event Engine:屏蔽 OS I/O 与线程原语的抽象层

Event Engine 为底层操作系统 I/O 与线程原语提供一致接口,gRPC 用它执行异步 I/O、任务调度与 DNS 解析,详细见 src/core/lib/event_engine/AGENTS.md

  • 公共接口 grpc_event_engine::experimental::EventEngine 位于 include/grpc/event_engine/event_engine.h(不在 src/core 内,属公共头文件);
  • 跨平台默认实现位于 default_event_engine_factory.{h,cc};平台特定实现分为 posix_enginewindowscf_engine 三个目录;
  • 关键类:EventEngine::Endpoint(连接的一端)、EventEngine::Listener(接受入站连接)、EventEngine::DNSResolver(DNS 解析);
  • 应用可通过调用 SetEventEngineFactory 注入自己的实现,便于把 gRPC 接入既有事件循环或自定义网络栈;
  • Event Engine 正在逐步取代旧的 iomgr 子系统(对照 src/core/lib/iomgr/AGENTS.md)。

三、编码风格:无异常(No Exceptions)与错误传播约定

src/core/AGENTS.md 对 gRPC Core 的编码约束非常明确——Core 代码不使用 C++ 异常。函数通过返回错误码来表达失败,可用的错误类型按优先顺序包括:

  1. bool:对简单函数仅表示成功/失败时,最直接高效;
  2. absl::Status / absl::StatusOr:跨层(cross layer)代码传播错误时的良好默认选择;
  3. StatusFlag(定义在 src/core/lib/promise 中):可被 Promise 库识别为错误状态的布尔量,配套的 ValueOrError 扮演 StatusOr 在该类型体系中的角色;
  4. 自定义错误类型:当上述形态都不适配你的失败场景时,允许(且鼓励)编写专属错误类型,但强烈建议提供把自定义错误归约(reduce)为 absl::Status 的机制,以保证错误可在层与层之间便捷传递。

四、目录结构:一张可深入阅读的地图

顶层文档按目录给出每个子系统的职责说明,且每个目录都配套一份同名 AGENTS.md。下表将原文目录列表转换为仓库根目录相对的路径,方便逐项深入:

目录 职责 深入文档
src/core/call 定义单次 RPC 基础数据结构的“心脏” call/AGENTS.md
src/core/channelz 检视 gRPC channel 状态(调用数、收发字节、传输状态等) channelz/AGENTS.md
src/core/client_channel 客户端 channel 核心实现:名字解析、负载均衡、连接状态 client_channel/AGENTS.md
src/core/config 静态与动态配置管理 config/AGENTS.md
src/core/credentials 凭据(credential)系统核心实现 credentials/AGENTS.md
src/core/ext Core 的扩展:filter 与 transport ext/README.md
src/core/filter channel filter 机制的基石 filter/AGENTS.md
src/core/handshaker 建立客户端与服务端安全连接的握手框架 handshaker/AGENTS.md
src/core/lib 通用功能库:数据结构、内存管理、平台相关代码 各子库自带 AGENTS(promise/event_engine/iomgr/slice/resource_quota 等)
src/core/load_balancing 灵活可扩展的负载均衡框架 load_balancing/AGENTS.md
src/core/plugin_registry 配置 gRPC Core 的主入口 plugin_registry/AGENTS.md
src/core/resolver 把逻辑名解析为网络地址列表的可插拔机制 resolver/AGENTS.md
src/core/server gRPC 服务端核心实现 server/AGENTS.md
src/core/service_config 对 channel 做按服务、按方法的配置机制 service_config/AGENTS.md
src/core/telemetry 采集与上报 gRPC 行为指标的系统 telemetry/AGENTS.md
src/core/transport 核心传输抽象 transport/AGENTS.md
src/core/tsi TLS、ALTS 等传输安全机制的抽象层(TSI) tsi/AGENTS.md
src/core/util 工具类与函数集合 util/AGENTS.md
src/core/xds xDS API 实现:客户端/服务端动态自发现与自配置 xds/AGENTS.md

此外从目录清单可以看到 src/core/net(网络相关)与 src/core/mitigation_engine(缓解引擎,目前仅有头文件)也已存在于 Core 中,顶层导览文档尚未为其单列章节。

五、关键子系统的源码级纵深解析

1. Client Channel:解析器、负载均衡与 Subchannel 的协作

src/core/client_channel/AGENTS.md 是理解“客户端一侧整条链路”的钥匙。它把一次连接的生命周期拆成几个可插拔抽象:

  • Resolver:把目标 URI(如 dns:///my-service.example.com)解析为一组后端地址。框架本身见 src/core/resolver/AGENTS.md,内置实现包括 DNS、sockaddr、fake(测试用)、google_c2p 与 xds 等子目录;
  • Subchannel:指向单个后端地址的连接。一个 ClientChannel 通常管理多个 Subchannel(resolver 返回几个地址就有几个);
  • LoadBalancingPolicy:从候选 subchannel 中为每次 RPC 挑选目标,框架见 src/core/load_balancing/AGENTS.md
  • SubchannelPicker:由每个 LB 策略持有的极简选择器,负责最终路由决策。

内置 LB 策略包括:pick_first(默认,顺序尝试地址列表)、round_robin(轮询)、weighted_round_robin(带权重的轮询)、ring_hash(一致性哈希,利于会话亲和)、grpclb(借助外部负载均衡进程)、xds(服务网格场景由 xDS 控制面下发)、rls(Route Lookup Service,按 RPC 查询路由)。新策略的开发方式也已文档化:实现 LoadBalancingPolicyLoadBalancingPolicyFactory 接口,再把工厂注册进 LoadBalancingPolicyRegistry

值得关注的演进点是:client channel 存在 Legacy 与 Modern 两套并行实现——传统上是回调式 filter(retry_filterdynamic_filters),而现代实现改走基于 promise 的 interceptor 模型(retry_interceptor.hretry_filter 的 Promise 版替代品)。ClientChannel 内部用 WorkSerializer 保证所有内部状态的线程安全;ConfigSelector 则允许同一 channel 上的不同 RPC 选用不同 service config(例如按方法区分重试策略)。

2. 配置体系:ConfigVars 与 CoreConfiguration 双单例

src/core/config/AGENTS.md 揭示了 Core 的两种配置形态:

  • ConfigVars:持有 gRPC 配置属性的单例,属性来源包括环境变量、Abseil flags 以及程序化覆写(override),统一通过 ConfigVars::Get() 访问;这些值由 config_vars.yaml 自动生成代码,保证“单一事实来源”;
  • CoreConfiguration:作为全部可插拔组件的中央注册表,采用 Builder 模式(CoreConfiguration::Builder)供各子系统注册 resolver、LB 策略、handshaker、channel filter 等工厂——这也是扩展 gRPC 功能的主要途径。例如要新增一个负载均衡策略,就是实现 LoadBalancingPolicyFactory 后注册进 CoreConfiguration::Builder
  • load_config.{h,cc} 提供从 flag、环境变量、程序化覆写按既定优先级顺序加载配置值的辅助函数。

3. 安全三件套:Handshaker、Credentials、TSI

  • Handshakersrc/core/handshaker/AGENTS.md):负责在客户端与服务端之间建立(安全)连接的可插拔握手框架,支持 TLS、ALTS、HTTP CONNECT 等。核心类 HandshakerHandshakerFactory 配套 HandshakerRegistry(按名字查找);另有 ProxyMapper 决定目标地址的代理设置。实现子目录包括 security(TLS/ALTS 握手)、http_connecttcp_connect(基础 TCP)以及存放端点信息的 endpoint_info
  • Credentialssrc/core/credentials/AGENTS.md):认证与授权的可插拔机制,其中 call 子目录 定义按调用附加安全信息的 grpc_call_credentialstransport 子目录 则存放与具体传输安全类型绑定的凭据实现;
  • TSIsrc/core/tsi/AGENTS.md):Transport Security Interface,把 TLS、ALTS 等安全机制抽象为统一接口(tsi_handshaker + tsi_frame_protector,见 transport_security_interface.h),使上层传输代码无需感知具体安全算法。实现包括 ssl(基于 OpenSSL)、altslocal(本地/UDS 连接)以及测试用的 fake

4. 其他子系统速览

  • Channelzsrc/core/channelz/AGENTS.md):调试与监控利器,可查询 channel 的调用数、收发数据量、底层传输状态。除 grpc_cli 外还提供 web 版查看器(zviz 子目录)与 v2/v1 格式转换(v2tov1/)。文档还特别强调了 DataSource生命周期与加锁约定DataSource 不由所挂载的 BaseNode 拥有,AddData 调用期间必须持有 data_sources_mu_,且 AddData 实现不得回调任何会再次获取该锁的代码路径(如 SourceConstructed/SourceDestructingSerializeEntity 等),否则会死锁;必要时可用 EventEngine 派发后台任务在锁外收集数据;
  • Serversrc/core/server/AGENTS.md):服务端核心。grpc_core::Server 负责监听、处理请求与回送响应;grpc_server_add_http2_portadd_port.cc)用于添加监听端口;上层 ServerBuilder 可配置线程数、最大并发请求数、安全凭据等。面向 xDS 的服务端还包含 xds_channel_stack_modifierxds_server_config_fetcher 等扩展组件;
  • xDSsrc/core/xds/AGENTS.md):通过集中式控制平面动态下发配置。核心 XdsClient 负责与 xDS 服务器的连接管理、资源请求与更新处理,由 JSON 格式的 bootstrap 文件XdsBootstrapxds_bootstrap.h)配置。gRPC 最关心的资源类型是 LDS(监听器)、RDS(路由)、CDS(集群)、EDS(端点/后端);负载上报由 LrsClient 完成。整个 xDS 功能正是“以插件方式运行期加载、通过 CoreConfiguration 注册工厂”的典型示范;
  • Name Resolutionsrc/core/resolver/AGENTS.md):Resolver 接口被刻意设计得简单易实现,因此新增解析机制成本很低——这是 gRPC 负载均衡与故障转移体系的关键一环;
  • Plugin Registrysrc/core/plugin_registry/AGENTS.md):从源码结构看,它充当 Core 库按需“裁剪/装配”各功能插件的总入口,构建期即可决定哪些插件进入当前二进制。

六、如何继续深入:给开发者的研读路径建议

  1. 从总览起步src/core/AGENTS.md(本文骨架)→ 依次打开上表每一行的 AGENTS.md,形成“总览 + 子系统”的两级知识框架;
  2. 按依赖顺序阅读 Call V3:官方建议先熟悉 Promise 库,因为 call 目录 是建立在 Promise API 之上的;随后可对照 client_channel/AGENTS.md 理解 MakeClientCallserver/AGENTS.md 理解 MakeServerCall
  3. 用代码验证抽象:关注 Call V1/V3 的专属与共享文件划分——例如 Call V3 独有 client_call/server_call/call_spine/call_filters,而 src/core/lib/surface/call.{h,cc}metadata_batch.{h,cc} 等则是两代模型共享的;
  4. 对照测试:Promise 库的测试集中在 test/core/promise,Call 相关测试则位于 test/core/call 等测试目录,阅读单测是理解各组件语义的最快路径。

这套 AGENTS 文档体系本身就是 gRPC 为贡献者设计的“导航系统”:每一层代码都配有职责、关键类、演进状态与坑点提示(例如 Channelz 的锁纪律、Promise 同步原语混用会导致死锁、ArenaPromise 已弃用等)。对想要理解或扩展 gRPC Core 的读者而言,沿着上述路径逐层下钻,即可从“知道架构概念”平稳过渡到“能在源码中定位并修改具体机制”。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
898
5.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
921
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.8 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
391