Protobuf 第三方生态全景:Protocol Buffers 的第三方实现、RPC 框架、构建集成与工具链
Protocol Buffers 的核心仓库不仅包含 Google 官方的 C++、Java、Python 等语言运行时与 protoc 编译器,还通过 docs/third_party.md 维护了一份庞大的第三方生态目录,覆盖 40 余种编程语言的 protobuf 实现、十余种 RPC 框架、构建系统集成、IDE 插件以及文档生成、校验、调试等实用工具。本文以这份官方目录为主体,完整梳理各分类下的项目清单,并结合当前仓库源码说明 protobuf 本体自身是如何消费第三方依赖的(如 vendored 的 zlib、jsoncpp、utf8_range),帮助你在选型时快速定位合适的实现、理解各生态类别的边界,并掌握评估第三方 protobuf 库的风险点。
一、文档定位与使用须知
docs/third_party.md 的原始表述非常明确:该页面列举的代码由第三方开发和维护,这些项目与 Google 没有隶属关系,也不代表 Google 的背书(除非明确标注),使用者需自行承担风险;并且其中许多项目处于开发早期阶段,尚未达到生产就绪(production-ready)。文档同时给出了贡献方式:如果你有应该收录的项目,应通过向 protobuf 仓库提交 pull request 来更新该页面。
理解这三点提示,是正确使用这份目录的前提:
- 目录中明确标注 "Google-official implementation" 的条目(如 C++、Go、Java、Python 对应的
protocolbuffers/protobuf仓库,以及 gRPC 对 C++、Node.js、Python、Ruby、Objective-C、PHP、C# 的支持)才属于官方支持范围; - 其余条目(nanopb、prost、scalapb、wire 等)虽然广泛使用,但属于社区项目,API 稳定性、安全响应、与最新 editions 特性(如仓库中 editions/ 目录所实现的 edition 2023/2024 特性)的跟进速度都需自行评估;
- 文档中部分条目已标注维护状态,例如 Erlang 生态明确注明 basho/erlang_protobuffs "不再维护,请改用 gpb",RPC 部分也单列了 "Inactive"(已停止维护)清单。
二、编程语言实现(Programming Languages)
这是目录中最长的一类,列举了实现 Protocol Buffers 的第三方(及部分官方)库。官方条目对应本仓库的实际代码:C++ 运行时在 src/google/protobuf/(含 upb 高性能解析内核 upb/),Java/Kotlin 运行时在 java/(Kotlin 官方支持见 java/kotlin/ 与 java/kotlin-lite/),Python 运行时在 python/,C# 在 csharp/,Ruby 在 ruby/,PHP 在 php/,以及仓库内直接提供的 Lua 绑定 lua/ 和 Rust 实验性绑定 rust/。
以下按文档原文完整继承各语言条目(外部项目地址以文档列出的仓库地址为原文记录,此处以纯文本给出,不转换为链接):
2.1 C / C++ 系
- C 语言:protobuf-c(github.com/protobuf-c/protobuf-c)、nanopb(koti.kapsi.fi/jpa/nanopb)、pbc(github.com/cloudwu/pbc)、upb(github.com/haberman/upb/wiki)、protobluff(github.com/squidfunk/protobluff)、pbtools(github.com/eerimoq/pbtools);
- C++ 语言:protocolbuffers/protobuf(Google 官方实现,即本仓库)、simple-protobuf(github.com/tonda-kriz/simple-protobuf)、EmbeddedProto(EmbeddedProto.com)、struct2x(github.com/yksten/struct2x);
- C/C++ 通用:spbc(spbc.sf.net)。
其中 nanopb 与 protobuf-c 是最典型的嵌入式 C 场景选择:它们不依赖官方 C++ 运行时,直接用 .proto 文件生成 C 结构体与编解码函数。值得注意的是,文档中列出的 upb 正是本仓库内 upb/ 目录的上游来源,upb 如今已内置于 protobuf 仓库并作为 C++ 与多种语言运行时的高性能 wire 解析内核(见 upb/README.md)。
2.2 JVM 系(Java / Kotlin / Scala)
- Java:protocolbuffers/protobuf(Google 官方实现,对应本仓库 java/core/ 与 java/lite/)、Wire(github.com/square/wire,Java/Android 向)、QuickBuffers(github.com/HebiRobotics/QuickBuffers,零拷贝方案)、Java ME 的 swingme 移植;
- Kotlin:kroto-plus(github.com/marcoferrer/kroto-plus)、kotlinx.serialization(github.com/Kotlin/kotlinx.serialization)、sisyphus(github.com/ButterCam/sisyphus)、protokt(github.com/open-toast/protokt)、pbandk(Kotlin Multiplatform,github.com/streem/pbandk)。
本仓库的 Kotlin 官方运行时位于 java/kotlin/,lite 裁剪版通过 java/kotlin-lite/lite.awk 从完整运行时派生生成;JVM AOT 使用方式可进一步参考 docs/jvm_aot.md。
2.3 .NET / C# 系
- C#:silentorbit.com/protobuf(文档收录的第三方 C# 实现;仓库内 csharp/ 目录为 Google 官方 C# 运行时);
- C# 生态在文档工具类中还收录了 protobuf-net(RPC 一节)、icerpc-csharp、gRPC 官方 C# 支持等。
2.4 脚本与动态语言
- Clojure / ClojureScript:clojure-protobuf、clojusc/protobuf、protojure(protojure.readthedocs.io)、clojobuf(github.com/s-expresso/clojobuf);文档工具类还收录了 clojure 生态的 rubberbuf(动态转译为 AST)与 clojobuf-serdes(二进制格式低层编解码);
- Elixir:exprotoc、protobuf-elixir、protox;
- Erlang:gpb(github.com/tomas-abrahamsson/gpb,推荐项)、piqi.org、erlang_protobuffs(文档注明已停止维护,改用 gpb);
- Go:golang/protobuf(Google 官方实现)、gopbuf、gogo/protobuf(github.com/gogo/protobuf,社区高星扩展);
- GopherJS:github.com/johanbrandhorst/protobuf(浏览器端 Go);
- Haskell:hprotoc(hackage)、proto-lens(标注为 Google 非官方实现)、proto3-suite(代码生成器)与 proto3-wire(二进制序列化器);
- Julia:ProtoBuf.jl(github.com/JuliaIO/ProtoBuf.jl);
- Lua:lua-protobuf、lua-pb。本仓库同时内置了一套可直接构建的 Lua 绑定 lua/(基于 upb,见 lua/README.md),可作为官方 Lua 方案的参照;
- Objective-C:protobuf-objc;本仓库官方 Objective-C 运行时见 objectivec/(GPBMessage 等);
- OCaml / Perl / PHP:piqi.org、Google::ProtocolBuffers 系列、allegro/php-protobuf、chobie/php-protocolbuffers(仓库内 php/ 为官方 PHP 实现,含 C 扩展 php/ext/);
- Python:protocolbuffers/protobuf(Google 官方实现)、eigenein/protobuf、python-betterproto(现代 Pythonic API);
- R:RProtoBuf;
- Ruby:ruby-protocol-buffers、beefcake、localshred/protobuf;
- Scala:scala-protobuf、ScalaBuff、scalapb(scalapb.github.io);
- Swift:protobuf-swift、swift-protobuf(github.com/apple/swift-protobuf);
- Rust:prost(github.com/tokio-rs/prost)、rust-protobuf、quick-protobuf。仓库内 rust/ 目录是官方 Rust 绑定(upb 之上的 C++ 内核封装),其 crate 发布材料位于 rust/release_crates/;
- 其他:Action Script(JProtoc、protobuf-as3)、Ada(github.com/reznikmm/protobuf)、C#(silentorbit)、Common Lisp(brown/protobuf、cl-protobuf)、D(protobuf-d、dproto、ProtocolBuffer)、Delphi(protobuf-delphi、fundementals)、Dart(dart-protobuf 运行时 + dart-protoc-plugin 生成器,dart-lang 官方)、Elixir、Elm(elm-protobuf)、Hacklang/HHVM(proto-hack)、GDScript(godobuf,Godot v3 插件)、Haxe(protoc-gen-haxe)、JavaScript(bufbuild/protobuf-es、protojs、ProtoBuf.js、node-protoc-plugin、node-protoc-gen-javascript、sisyphus-js)、Kotlin Multiplatform、Purescript、Prolog(SWI-Prolog protobufs 包)、Solidity(pb3-gen-sol)、TypeScript(protobuf-es、ts-protoc-gen、protoc-gen-ts、pbkit)、Vala、Zig(zig-protobuf)。
从条目数量可以推断:JavaScript/TypeScript、Kotlin、Clojure 与 C 语言是第三方实现最密集的区域,选型时同一语言下往往需要比较多个项目的活跃度、editions/新特性支持(如字段 presence、JSON mapping)与许可证。
三、RPC 实现(RPC Implementations)
文档对此类有一句关键说明:gRPC(grpc.io)是 Google 针对 Protocol Buffers 的官方 RPC 实现;其余第三方 RPC 实现中,一部分真正工作在 protobuf 的 service 定义上(即 .proto 文件中 service 关键字定义的服务),另一部分只是复用 protobuf 消息对象作为序列化格式。
3.1 活跃项目(按文档原文)
- gRPC(github.com/grpc/grpc,C++、Node.js、Python、Ruby、Objective-C、PHP、C#,Google 官方实现);
- Connect(connectrpc.com,Go、JavaScript、TypeScript、Python、Dart、Swift、Kotlin);
- ZeroC ICE(zeroc.com/products/ice,多语言);
- protobuf-net(github.com/protobuf-net/protobuf-net,C#/.NET/WCF/VB);
- DeltaV 外部序列化(C++);
- protojure(Clojure);
- sofa-pbrpc(github.com/baidu/sofa-pbrpc,C++);
- protobuf-csharp-rpc、libpbrpc(C++)、grpc-protobuf-validation(Java)、elixir-grpc/grpc(Elixir);
- GopherJS 版 protobuf(github.com/johanbrandhorst/protobuf)、gRPC-haskell(Haskell);
- raster(github.com/Yeolar/raster,C++)、wsrpc(JavaScript Node.js/浏览器);
- pbkit 的 frpc 测试实现(TypeScript Node.js/浏览器);
- xsrpcj(Java)、twirp(github.com/twitchtv/twirp,多语言);
- icerpc-csharp(C#);
- amp-embedded-infra-lib(C++、C#、Java,嵌入式基础设施库);
- blerpc(C/nanopb、Python、Kotlin、Swift、Dart、TypeScript,走 BLE 蓝牙低功耗的 RPC)。
3.2 已停止维护清单(Inactive)
文档单独列出了 Inactive 清单,收录了大量 code.google.com 时代的项目(protobuf-actionscript3、protoc-gen-as3、protobuf-csharp-port、protobuf-javame、protobuf-rpc-pro、txprotobuf、modeswitch/protobuf-rpc、protobuf-socket-rpc、proto-streamer、server1、protobuf-mina-rpc、casocklib、cxf-protobuf、protobuf-remote、eneter-protobuf-serializer、claire/protorpc、arab、rpcz、libmaid、protobuf-js、protobuf-for-node、protostuff、protoc-gen-lua、protobuf-matlab、protobuf-mercury、protobuf-objc、protobuf-perlxs、pb4php、ruby-protobuf、protobuf-scala、protoc-gen-docbook 等)。这一清单的实际价值在于提醒读者:看到老文章中引用的这些项目时,应默认其不可用于新项目。
四、构建系统集成(Build)
文档的 Build 一节覆盖了将 .proto 文件纳入主流构建系统的第三方插件,这也是本仓库自身构建体系中大量使用的集成方式:
-
Bazel Build(bazel.build)及其规则集:
- rules_closure(
js-closure); - rules_go(
go); - rules_protobuf(
javac++c#gojs-closurejs-nodepythonruby)。
本仓库正是 Bazel 用户:根目录 BUILD.bazel、WORKSPACE、WORKSPACE.bzlmod 以及自研的 proto 规则 bazel/(如 bazel/proto_library.bzl、bazel/cc_proto_library.bzl、bazel/py_proto_library.bzl、bazel/java_proto_library.bzl)都展示了
proto_library风格的规则如何按语言生成代码,与文档中 rules_protobuf 的角色类似。 - rules_closure(
-
Maven Protobuf Compiler Plugin:
- xolstice 的 protobuf-maven-plugin(xolstice.org 有文档,源码在 github.com/xolstice/protobuf-maven-plugin,发布在 Maven Central);
- 早期的 maven-protoc-plugin(code.google.com);
- os72 的 protoc-jar-maven-plugin;
- ascopes 的 protobuf-maven-plugin。
-
Gradle:google/protobuf-gradle-plugin(文档收录的 Gradle 插件)。
-
sbt:Atry/sbt-cppp(Protocol Buffers 的 sbt 插件)。
仓库中 CMake 构建对第三方构建集成的对应物是 cmake/ 目录:cmake/dependencies.cmake 管理外部依赖、cmake/protobuf-generate.cmake 提供 protobuf_generate 类的生成宏,使用细节见 docs/cmake_protobuf_generate.md。
五、IDE 支持(IDE)
文档收录的编辑器工具,与本仓库 editors/ 目录提供的原生语法高亮/配置互相补充(editors/README.txt 说明该目录存放让编辑器正确显示 .proto 文件的高亮与配置文件,各文件头注释有具体用法;例如 editors/proto.vim 与 editors/protobuf-mode.el):
- Buf for Visual Studio Code(marketplace 扩展);
- vscode-proto3(zxh404 的 VS Code 支持);
- Visual Studio 语言服务支持(visualstudiogallery);
- IntelliJ IDEA 插件:jvolkman/intellij-protobuf-editor 与 devkanro/intellij-protobuf-plugin;
- TextMate 语法高亮(michaeledgar/protobuf-tmbundle);
- Notepad++ 的 .proto 高亮(chai2010/notepadplus-protobuf);
- Eclipse 编辑器(Google 出品的 code.google.com/p/protobuf-dt);
- NetBeans IDE 插件(code.google.com/p/protobuf-netbeans-plugin);
- 序列化 protobuf 数据的可视化编辑器 protobufeditor(code.google.com/p/protobufeditor)。
六、文档生成与其他工具(Documentation / Other Utilities)
6.1 文档生成器
文档在 Documentation 一节收录了 protoc-gen-doc:一个支持 Markdown/HTML/DocBook 等输出的文档生成插件(github.com/pseudomuto/protoc-gen-doc)。所有此类工具的共同模式是作为 protoc 插件工作——protoc 通过 CodeGeneratorRequest 把 descriptor 喂给插件进程,插件输出 CodeGeneratorResponse 完成代码/文档生成。本仓库 src/google/protobuf/compiler/ 目录实现了插件协议本身,第三方插件开发者可直接对接。
6.2 其他实用工具(按文档原文完整继承)
- Buf CLI(buf.build):代码生成、Lint、破坏性变更检测(breaking change detection)、格式化、调用 gRPC API(curl 式)、编辑器集成与 LSP;
- Wireshark/Ethereal 抓包插件(code.google.com/p/protobuf-wireshark):按
.proto解析抓到的二进制流,排查线上 wire 数据利器; - Java protobuf 的 JSON/XML/HTML 替代编码(protobuf-java-format,code.google.com)、另一个 Java JSON 编解码器(sijuv/protobuf-codec);
- Oracle PL SQL 插件(protocol-buffer-plsql);
- C++ Builder 兼容版 protobuf(saadware/protobuf-cppbuilder);
- nginx 的 Protobuf 模块(dbcode/protobuf-nginx);
- RSpec matchers 与 Cucumber 步骤定义(protobuf_spec);
- protoc-jar:多平台可执行 JAR 与 Java API,跨环境调用
protoc(os72/protoc-jar); - Python 脚本在 protobuf 与 JSON 间互转(NextTuesday/py-pb-converters);
- C++ 的 protobuf/JSON 互转库(yinqiwen/pbjson);
- protobuf-el:Java EE7 EL 3.0 纯 Java ProtoBuf 解析器/Builder;
- protoc-gen-lint:
.proto文件 linter(ckaznocha); - protobuf-dynamic:程序化创建 protobuf schema 的动态 schema 库(os72);
- node-protoc-plugin:在 Node.js 中编写 protoc 插件(konsumer);
- ProfaneDB:基于 Protocol Buffers 的数据库(profanedb.gitlab.io);
- hypothesis-protobuf:基于 Hypothesis 的属性测试工具与消息生成器(CurataEng);
- protolock:防止
.proto出现向后不兼容变更的 CLI(nilslice); - optional-grpc:面向可测试微服务的 gRPC(Python);
- go-protoparser:解析
.proto文件的 Go 包(yoheimuta,支持 proto2+proto3); - protolint:强制 protobuf 风格与惯例的工具(yoheimuta),配套 vscode-protolint、intellij-protolint、vim-protolint;
- super-linter:把 protobuf lint 作为 GitHub Action(github/super-linter);
- protoc-gen-fieldmask:生成静态类型 fieldmask 路径的插件(idodod);
- protoc-gen-bq-schema:生成 BigQuery schema 的 protoc 插件(GoogleCloudPlatform);
- protobuf-decoder-explainer:粘贴二进制 protobuf 后解码并逐字段解释的网页工具(jamesdbrock);
- gRPC Federation:通过在
.proto中写自定义 option 生成 gRPC server(mercari/grpc-federation); - protoboiler:用模板从
.proto生成样板代码的插件(in4lio)。
可以推断,这一类工具的共同主题是围绕 .proto 文件的治理:lint(protolint、protoc-gen-lint、Buf lint、super-linter)、兼容性防护(protolock、Buf breaking)、可观测性(Wireshark 插件、decoder-explainer)与代码生成增强(protoc-gen-fieldmask、protoc-gen-bq-schema、protoboiler)。
七、从本仓库源码看"第三方"的另一面:官方仓库如何消费第三方依赖
文档标题中的 "Third-Party" 在 protobuf 仓库内部还有另一层含义:third_party/ 目录本身就是官方仓库管理第三方代码的位置。观察其实际内容,可以学到官方工程组织第三方依赖的方式:
- third_party/zlib.BUILD 与 third_party/jsoncpp.BUILD:这两个文件并不直接包含源码,而是"外置 BUILD 文件"——protobuf_deps.bzl 中通过
http_archive/_github_archive从网络下载 zlib 1.3.1(第 82-92 行)与 jsoncpp 1.9.6(第 94-101 行)源码,并用build_file = Label("//third_party:zlib.BUILD")把本仓库的构建规则注入外部归档。细节值得注意:- zlib 规则用
genrule把 11 个公共头文件复制到zlib/include/子目录再暴露(third_party/zlib.BUILD 第 26-35 行),注释说明这是"为了限制includes通过:zlib传播造成的影响"; - jsoncpp 规则以
copts = ["-DJSON_USE_EXCEPTION=0"]关闭异常(第 25-27 行),并把.inl文本头文件单独放在:private目标中; - 两者都按 BSD/公共域/许可证声明了
licenses。
- zlib 规则用
- third_party/utf8_range/:一份被完整 vendored 进仓库的第三方 C 库,用于 SIMD 加速的 UTF-8 校验(NEON/SSE4/AVX2 三套实现,见 third_party/utf8_range/utf8_range.h 与 third_party/utf8_range/utf8_validity.h;算法对比与基准说明见 third_party/utf8_range/README.md)。它在核心运行时的调用点包括:
- wire 解析:src/google/protobuf/parse_context.cc(第 33 行
#include "utf8_validity.h")、src/google/protobuf/wire_format_lite.cc; - JSON 解析:src/google/protobuf/json/internal/lexer.cc 与 src/google/protobuf/json/internal/untyped_message.cc;
- upb 内核:upb/wire/decode_fast/field_string.c、upb/wire/internal/decoder.h、upb/text/internal/encode.h;
- C 扩展打包:PHP 扩展 php/ext/google/protobuf/config.m4 与 php/BUILD.bazel(第 92、222-225 行)、Ruby 扩展 ruby/ext/google/protobuf_c/extconf.rb、Python 扩展 python/BUILD.bazel(第 120 行)都显式依赖
//third_party/utf8_range:utf8_range_srcs,将其随各语言原生扩展分发。 - 对应的 CMake 侧集成见 cmake/utf8_range.cmake 与 third_party/utf8_range/CMakeLists.txt。
- wire 解析:src/google/protobuf/parse_context.cc(第 33 行
这说明官方仓库处理第三方代码遵循两类模式:小依赖用"下载源码 + 仓库内 BUILD 规则注入",核心路径依赖则直接 vendored 进 third_party/utf8_range/ 并纳入 fuzz(third_party/utf8_range/fuzz/)与单测(third_party/utf8_range/utf8_validity_test.cc)。这与 docs/third_party.md 面向外部生态的定位形成互补:前者是"别人写的 protobuf 周边",后者是"protobuf 自己依赖的别人"。
八、选型建议与风险边界
结合文档声明与仓库证据,使用这份第三方目录时建议遵循:
- 优先官方实现:仓库 README.md 所支持的 C++/Java/Python/C#/Objective-C/PHP/Ruby/Go(官方 Go 实现位于独立仓库 golang/protobuf)、Kotlin(java/kotlin/)、Rust(rust/)、Dart、Lua(lua/)等,其代码在本仓库可查证;文档中标注 "Google-official" 的条目与之对应;
- 区分"实现类"与"工具类":语言实现(第二节)替换的是运行时,RPC 框架(第三节)替换的是通信层,构建插件(第四节)与 IDE/文档/lint 工具(第五、六节)通常可与官方实现叠加使用,三者的引入风险递减;
- 警惕版本与特性差距:官方 C++ 运行时正在向 upb 内核与 editions 体系演进(见 upb/、editions/、hpb/ 目录),第三方库对字段 presence(docs/field_presence.md)、JSON mapping(docs/options.md)等新语义的跟进速度不一,选型前应以目标库的
.proto特性覆盖度为准; - Inactive 即弃用:文档 RPC 一节的 Inactive 清单(大量 code.google.com 项目)不应再用于任何新项目,其中部分项目(如 protobuf-net)已迁移到新地址并被收录到活跃清单中,引用旧文章时需比对两者。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00