ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

gRPC 框架解析:RPC 核心库、多语言运行时与 MongoDB 源码中的 gRPC 集成实践

gRPC 框架解析:RPC 核心库、多语言运行时与 MongoDB 源码中的 gRPC 集成实践 gRPC 框架解析RPC 核心库、多语言运行时与 MongoDB 源码中的 gRPC 集成实践【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongogRPC 是一个现代、开源、高性能的远程过程调用RPC框架能够在任意环境中运行让客户端与服务器应用透明地通信从而简化分布式系统的搭建。本文以本仓库中随 MongoDB 一起维护的 gRPC 官方 README位于 src/third_party/grpc/dist/README.md为骨架系统讲解 gRPC 的核心定位、各语言运行时接入方式、共享 C 核心库的仓库结构并结合本仓库源码深入说明 gRPC 如何被裁剪、构建并集成到 MongoDB 的 gRPC 传输层net.grpc.port等参数之中。读完本文你将理解 gRPC 的整体生态与架构并能在 MongoDB 源码中定位 gRPC 的构建入口、配置参数与传输层实现。gRPC 是什么按照 gRPC 官方 README 的定义gRPC 是一个现代、开源、高性能的远程过程调用RPC框架可以在任何地方运行。它使客户端与服务器应用能够透明地相互通信并简化连接系统的构建。这套设计理念的核心是上层应用不必关心底层网络细节只需要声明服务接口即可获得跨语言、跨平台的调用能力。gRPC 项目有自己的官网grpc.io与邮件列表grpc-iogooglegroups.com用于发布文档、答疑与社区讨论。在本仓库中gRPC 以第三方依赖的形式被引入源码完整保留在 src/third_party/grpc/dist 目录下包含README.md、LICENSE、CONCEPTS.md、TROUBLESHOOTING.md、CONTRIBUTING.md等完整文档并作为 MongoDB 的 gRPC 传输层实现的基础。开始使用 gRPC各语言运行时接入方式为了最大化可用性gRPC 支持标准的依赖添加方式——即使用开发者所选语言的包管理器如果有的话。在大多数语言中gRPC 运行时以语言包管理器中的软件包形式提供。README 中列出的各语言接入方式如下语言接入方式在 vendored 副本中的状态C遵循 src/cpp 目录下的指引保留本仓库核心C#/.NETNuGet 包Grpc.Net.Client、Grpc.AspNetCore.Server独立仓库 grpc-dotnet 维护独立仓库Dartpub 包grpc独立仓库 grpc-dart 维护独立仓库Gogo get google.golang.org/grpc独立仓库 grpc-go 维护独立仓库Java使用 Maven Central 仓库中的 JAR独立仓库 grpc-java 维护独立仓库Kotlin使用 Maven Central 仓库中的 JAR独立仓库 grpc-kotlin 维护独立仓库Nodenpm install grpc/grpc-js独立仓库 grpc-node 维护独立仓库Objective-C在 podspec 中添加gRPC-ProtoRPC依赖已被裁剪PHPpecl install grpc已被裁剪Pythonpip install grpcio已被裁剪Rubygem install grpc已被裁剪WebJS遵循 grpc-web 的指引独立仓库 grpc-web 维护独立仓库各语言的快速入门指南与教程可以在 grpc.io 官网的文档区找到代码示例则位于 examples 目录。此外gRPCmaster分支HEAD的每日预编译bleeding-edge构建会发布到 packages.grpc.io 供提前试用。值得说明的是本仓库中的 gRPC 是 MongoDB 团队维护的裁剪版。从 src/third_party/grpc/scripts/import.sh 可以看到MongoDB 从mongodb-forks/grpc仓库以v1.74.1版本导入 gRPC并在导入后删除了src/python、src/ruby、src/php、src/csharp、src/objective-c、src/android等非 C 语言的目录以及examples下的多语言示例、.podspec/.gemspec打包文件。因此上表中C与独立仓库两类的语言运行时保持可用而已被裁剪的语言在本仓库内不再有源码需按各自官方仓库的方式接入。从源码开发 gRPC贡献与构建流程README 指出gRPC 欢迎社区贡献并指引开发者阅读 CONTRIBUTING.md。这份文档覆盖了完整的贡献工作流包括如何从源码构建 gRPC、如何运行测试、如何向 gRPC 代码库提交改动以及贡献流程的运作方式与最佳实践。对于本仓库而言gRPC 的构建并非由开发者手工执行而是通过 Bazel 构建系统完成。仓库中的 src/mongo/transport/grpc/BUILD.bazel 引用了外部依赖目标com_github_grpc_grpc//:grpc_reflection并定义了mongo_cc_grpc_library这样的封装规则用来根据.proto文件生成 C 的 gRPC 服务与存根代码例如core_test_cc_grpc。也就是说在 MongoDB 的构建体系中gRPC 是以 Bazel 外部仓库 本地封装规则的形式被编译链接的而不是在仓库内单独构建。故障排查gRPC 官方 README 建议当遇到问题时查阅 TROUBLESHOOTING.md 故障排查指南。该文档随 gRPC 一同被 vendored 进本仓库涵盖常见的编译、链接、运行时问题定位方法。结合本仓库的实践MongoDB 的 gRPC 传输层也定义了自己的故障边界在 grpc_transport_layer.h 中可以确认该集成不支持 transient SSL context一旦遇到相关配置会直接返回InvalidSSLConfiguration错误关闭shutdown时则会取消所有进行中的 RPC包括入站与出站并阻塞直到它们全部完成。这些都是排查 MongoDB gRPC 相关问题时值得注意的行为。性能README 提到gRPC 项目维护了一个性能看板展示 master 分支每日构建的性能数据用于持续监控 RPC 框架的各项性能指标。对于关注 MongoDB gRPC 传输层性能的读者可以从 src/mongo/transport/grpc 目录下的连接池channel_pool、客户端缓存client_cache、会话管理grpc_session_manager等实现入手结合框架自身的基准测试理解性能特征。核心概念从 CONCEPTS.md 入手README 将 CONCEPTS.md 作为理解 gRPC 的入门文档其中系统介绍了 gRPC 的通道channel、存根stub、服务端/客户端流式调用streaming、元数据metadata、超时与取消、健康检查等核心抽象。这些概念在 MongoDB 的 gRPC 集成中都有对应的实现痕迹src/mongo/transport/grpc目录下存在channel_pool.h通道池、client_stream.h/server_stream.h/grpc_client_stream.h/grpc_server_stream.h流式调用封装、metadata.h元数据处理、reactor.h异步 Reactor 模型等文件可以在阅读概念文档后逐一对照。仓库结构共享的 C 核心库README 的About This Repository一节明确了 gRPC 仓库的核心组织方式本仓库包含用多种语言实现的 gRPC 库的源码它们全部构建在一个共享的 C 核心库 src/core 之上。各语言库的开发状态可能各不相同gRPC 官方欢迎为所有语言库贡献代码。语言与源码位置的对应关系如下本仓库中保留的以粗体标注语言源码位置共享 C 核心库src/core本仓库保留Csrc/cpp本仓库保留Rubysrc/ruby已被裁剪Pythonsrc/python已被裁剪PHPsrc/php已被裁剪C#基于核心库src/csharp已被裁剪Objective-Csrc/objective-c已被裁剪Java / Kotlin / Go / NodeJS / WebJS / Dart / .NET纯 C# 实现/ Swift各自独立的官方仓库查看本仓库实际保留的 src/third_party/grpc/dist/src 目录可以看到core/核心库、cpp/C 封装、compiler/protoc 插件用于从.proto生成 gRPC 代码、proto/以及一组被捆绑进来的第三方依赖abseil-cpp、boringsslTLS 实现、c-aresDNS 解析、benchmark等。这与 README 中多语言库共享同一个 C 核心的描述完全吻合——所有语言实现最终都向下收敛到 C 核心。MongoDB 中的 gRPC从第三方依赖到传输层这一节是本仓库视角的延伸gRPC 在 MongoDB 中不仅仅是引入的第三方库而是被深度集成为一个完整的传输层TransportLayer实现所有相关代码集中在 src/mongo/transport/grpc。导入与版本管理src/third_party/grpc/scripts/import.sh 展示了 gRPC 的导入方式指定REVISIONv1.74.1、VERSION1.74.1从 MongoDB 维护的 gRPC fork 克隆到src/third_party/grpc/dist随后删除非 C 语言目录与打包文件只保留构建 MongoDB 所需的 C 核心部分。因此dist目录即当前仓库实际使用的 gRPC 版本快照。传输层抽象GRPCTransportLayergrpc_transport_layer.h 中的GRPCTransportLayer是核心抽象它包装了 gRPC 的 Server 与 Client 实现旨在向会话工作流、服务入口点及命令执行路径隐藏 gRPC 的具体细节。其要点包括出站egress固定使用mongodb.CommandService所有出站 RPC 都经由该服务通信而入站ingress可以注册任意 gRPC 服务通过registerService()在setup()之前注册。生命周期管理关闭时取消所有进行中的 RPC入站与出站并阻塞等待完成出站模式需要等待所有会话析构入站模式需要等待所有 RPC 处理器返回。配置项Optionsstruct Options { bool enableEgress false; // 是否启用出站方向 bool enableIngress true; // 是否启用入站方向 std::vectorstd::string bindIpList; // 绑定地址列表 int bindPort; // 绑定端口0 表示绑定任意空闲端口 bool useUnixDomainSockets; // 是否使用 Unix 域套接字 int unixDomainSocketPermissions; // Unix 域套接字权限 int maxServerThreads; // 服务器最大线程数 boost::optionalBSONObj clientMetadata; // 客户端元数据 };会话建立通过connectWithAuthToken同步与asyncConnectWithAuthToken异步带ReactorHandle与取消令牌建立到对端的会话支持携带认证令牌。协议标识getNameForLogging()返回gRPCgetTransportProtocol()返回TransportProtocol::GRPC表明它是 MongoDB 的正式传输协议之一。配置参数net.grpc.* 与保活参数gRPC 传输层的运行参数由 IDL 定义见 grpc_parameters.idl参数说明默认值/取值范围net.grpc.port短名grpcPortgRPC 监听端口默认在 server_options.h 中定义注释标注为 27021取值范围 165535net.grpc.serverMaxThreads短名grpcServerMaxThreadsgRPC 会话线程数上限默认 1000取值 ≥ 1grpcKeepAliveTimeMsPING 帧发送间隔检测已建立 gRPC 通道的存活状态运行时更新仅作用于新建通道默认 2147483647INT_MAX支持 startup 与 runtime 两阶段设置grpcKeepAliveTimeoutMsPING 帧等待确认的超时时间客户端在超时未收到确认时关闭连接运行时更新仅作用于新建通道默认 20000支持 startup 与 runtime 两阶段设置这些参数通过 IDL 的source: [cli, ini, yaml]声明意味着既可以在命令行、INI 配置文件中指定也可以在 MongoDB 的 YAML 配置文件中设置最终落入serverGlobalParams全局结构。集成验证从源码测试到构建规则仓库中提供了多层次的验证证据greeter_server.h 是经典的 helloworld Greeter 服务端实现源自 gRPC 官方示例展示了grpc::ServerBuilder、InsecureServerCredentials()、RegisterService等 API 的标准用法。grpc_source_test.cpp 是基于mongo::unittest的集成测试它启用默认健康检查服务grpc::EnableDefaultHealthCheckService与 Proto 反射插件grpc::reflection::InitProtoReflectionServerBuilderPlugin在127.0.0.1:50051上启动一个无认证的 gRPC 服务器并断言构建成功——直接验证了 vendored gRPC 在本仓库内可以被正常编译链接并运行。src/mongo/transport/grpc/BUILD.bazel 中的mongo_cc_grpc_library封装了.proto到 C gRPC 代码的生成规则同时通过grpc_feature_flag.idl控制 gRPC 特性的开关通过grpc_parameters.idl生成参数定义保证配置与构建在 Bazel 体系内自洽。此外src/mongo/transport/grpc下还有core_test.proto与core_test_strip_prefix.proto两个测试协议文件以及grpc_transport_layer_integration_test.cpp、grpc_session_test.cpp、client_cache_test.cpp等大量单元与集成测试共同构成对 gRPC 集成功能的完整验证网络。小结从 gRPC 官方 README 出发可以看到gRPC 是一个以共享 C 核心库为底座、向多语言提供统一运行时接入方式的高性能 RPC 框架其概念、故障排查与贡献流程文档在本仓库的 src/third_party/grpc/dist 中完整保留。而在 MongoDB 这一具体项目中gRPC 被裁剪为纯 C 版本v1.74.1并通过 src/mongo/transport/grpc 的传输层抽象、IDL 参数体系与 Bazel 构建规则深度集成最终以net.grpc.port、grpcKeepAliveTimeMs等配置项的形式暴露给运维人员。理解这条官方框架 → 仓库裁剪 → 传输层集成的链路是深入阅读 MongoDB gRPC 相关代码的最佳起点。【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表