ARTICLE DETAIL

资讯详情

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

Protobuf 第三方生态全景:Protocol Buffers 的第三方实现、RPC 框架、构建集成与工具链

Protobuf 第三方生态全景:Protocol Buffers 的第三方实现、RPC 框架、构建集成与工具链 Protobuf 第三方生态全景Protocol Buffers 的第三方实现、RPC 框架、构建集成与工具链【免费下载链接】protobufProtocol Buffers - Googles data interchange format项目地址: https://gitcode.com/GitHub_Trending/pr/protobufProtocol 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 不再维护请改用 gpbRPC 部分也单列了 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-cgithub.com/protobuf-c/protobuf-c、nanopbkoti.kapsi.fi/jpa/nanopb、pbcgithub.com/cloudwu/pbc、upbgithub.com/haberman/upb/wiki、protobluffgithub.com/squidfunk/protobluff、pbtoolsgithub.com/eerimoq/pbtoolsC 语言protocolbuffers/protobufGoogle 官方实现即本仓库、simple-protobufgithub.com/tonda-kriz/simple-protobuf、EmbeddedProtoEmbeddedProto.com、struct2xgithub.com/yksten/struct2xC/C 通用spbcspbc.sf.net。其中 nanopb 与 protobuf-c 是最典型的嵌入式 C 场景选择它们不依赖官方 C 运行时直接用.proto文件生成 C 结构体与编解码函数。值得注意的是文档中列出的 upb 正是本仓库内 upb/ 目录的上游来源upb 如今已内置于 protobuf 仓库并作为 C 与多种语言运行时的高性能 wire 解析内核见 upb/README.md。2.2 JVM 系Java / Kotlin / ScalaJavaprotocolbuffers/protobufGoogle 官方实现对应本仓库 java/core/ 与 java/lite/、Wiregithub.com/square/wireJava/Android 向、QuickBuffersgithub.com/HebiRobotics/QuickBuffers零拷贝方案、Java ME 的 swingme 移植Kotlinkroto-plusgithub.com/marcoferrer/kroto-plus、kotlinx.serializationgithub.com/Kotlin/kotlinx.serialization、sisyphusgithub.com/ButterCam/sisyphus、protoktgithub.com/open-toast/protokt、pbandkKotlin Multiplatformgithub.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-netRPC 一节、icerpc-csharp、gRPC 官方 C# 支持等。2.4 脚本与动态语言Clojure / ClojureScriptclojure-protobuf、clojusc/protobuf、protojureprotojure.readthedocs.io、clojobufgithub.com/s-expresso/clojobuf文档工具类还收录了 clojure 生态的 rubberbuf动态转译为 AST与 clojobuf-serdes二进制格式低层编解码Elixirexprotoc、protobuf-elixir、protoxErlanggpbgithub.com/tomas-abrahamsson/gpb推荐项、piqi.org、erlang_protobuffs文档注明已停止维护改用 gpbGogolang/protobufGoogle 官方实现、gopbuf、gogo/protobufgithub.com/gogo/protobuf社区高星扩展GopherJSgithub.com/johanbrandhorst/protobuf浏览器端 GoHaskellhprotochackage、proto-lens标注为Google 非官方实现、proto3-suite代码生成器与 proto3-wire二进制序列化器JuliaProtoBuf.jlgithub.com/JuliaIO/ProtoBuf.jlLualua-protobuf、lua-pb。本仓库同时内置了一套可直接构建的 Lua 绑定 lua/基于 upb见 lua/README.md可作为官方 Lua 方案的参照Objective-Cprotobuf-objc本仓库官方 Objective-C 运行时见 objectivec/GPBMessage 等OCaml / Perl / PHPpiqi.org、Google::ProtocolBuffers 系列、allegro/php-protobuf、chobie/php-protocolbuffers仓库内 php/ 为官方 PHP 实现含 C 扩展 php/ext/Pythonprotocolbuffers/protobufGoogle 官方实现、eigenein/protobuf、python-betterproto现代 Pythonic APIRRProtoBufRubyruby-protocol-buffers、beefcake、localshred/protobufScalascala-protobuf、ScalaBuff、scalapbscalapb.github.ioSwiftprotobuf-swift、swift-protobufgithub.com/apple/swift-protobufRustprostgithub.com/tokio-rs/prost、rust-protobuf、quick-protobuf。仓库内 rust/ 目录是官方 Rust 绑定upb 之上的 C 内核封装其 crate 发布材料位于 rust/release_crates/其他Action ScriptJProtoc、protobuf-as3、Adagithub.com/reznikmm/protobuf、C#silentorbit、Common Lispbrown/protobuf、cl-protobuf、Dprotobuf-d、dproto、ProtocolBuffer、Delphiprotobuf-delphi、fundementals、Dartdart-protobuf 运行时 dart-protoc-plugin 生成器dart-lang 官方、Elixir、Elmelm-protobuf、Hacklang/HHVMproto-hack、GDScriptgodobufGodot v3 插件、Haxeprotoc-gen-haxe、JavaScriptbufbuild/protobuf-es、protojs、ProtoBuf.js、node-protoc-plugin、node-protoc-gen-javascript、sisyphus-js、Kotlin Multiplatform、Purescript、PrologSWI-Prolog protobufs 包、Soliditypb3-gen-sol、TypeScriptprotobuf-es、ts-protoc-gen、protoc-gen-ts、pbkit、Vala、Zigzig-protobuf。从条目数量可以推断JavaScript/TypeScript、Kotlin、Clojure 与 C 语言是第三方实现最密集的区域选型时同一语言下往往需要比较多个项目的活跃度、editions/新特性支持如字段 presence、JSON mapping与许可证。三、RPC 实现RPC Implementations文档对此类有一句关键说明gRPCgrpc.io是 Google 针对 Protocol Buffers 的官方 RPC 实现其余第三方 RPC 实现中一部分真正工作在 protobuf 的 service 定义上即.proto文件中service关键字定义的服务另一部分只是复用 protobuf 消息对象作为序列化格式。3.1 活跃项目按文档原文gRPCgithub.com/grpc/grpcC、Node.js、Python、Ruby、Objective-C、PHP、C#Google 官方实现Connectconnectrpc.comGo、JavaScript、TypeScript、Python、Dart、Swift、KotlinZeroC ICEzeroc.com/products/ice多语言protobuf-netgithub.com/protobuf-net/protobuf-netC#/.NET/WCF/VBDeltaV 外部序列化CprotojureClojuresofa-pbrpcgithub.com/baidu/sofa-pbrpcCprotobuf-csharp-rpc、libpbrpcC、grpc-protobuf-validationJava、elixir-grpc/grpcElixirGopherJS 版 protobufgithub.com/johanbrandhorst/protobuf、gRPC-haskellHaskellrastergithub.com/Yeolar/rasterC、wsrpcJavaScript Node.js/浏览器pbkit 的 frpc 测试实现TypeScript Node.js/浏览器xsrpcjJava、twirpgithub.com/twitchtv/twirp多语言icerpc-csharpC#amp-embedded-infra-libC、C#、Java嵌入式基础设施库blerpcC/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 Buildbazel.build及其规则集rules_closurejs-closurerules_gogorules_protobufjavacc#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 的角色类似。Maven Protobuf Compiler Pluginxolstice 的 protobuf-maven-pluginxolstice.org 有文档源码在 github.com/xolstice/protobuf-maven-plugin发布在 Maven Central早期的 maven-protoc-plugincode.google.comos72 的 protoc-jar-maven-pluginascopes 的 protobuf-maven-plugin。Gradlegoogle/protobuf-gradle-plugin文档收录的 Gradle 插件。sbtAtry/sbt-cpppProtocol 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.elBuf for Visual Studio Codemarketplace 扩展vscode-proto3zxh404 的 VS Code 支持Visual Studio 语言服务支持visualstudiogalleryIntelliJ IDEA 插件jvolkman/intellij-protobuf-editor 与 devkanro/intellij-protobuf-pluginTextMate 语法高亮michaeledgar/protobuf-tmbundleNotepad 的 .proto 高亮chai2010/notepadplus-protobufEclipse 编辑器Google 出品的 code.google.com/p/protobuf-dtNetBeans IDE 插件code.google.com/p/protobuf-netbeans-plugin序列化 protobuf 数据的可视化编辑器 protobufeditorcode.google.com/p/protobufeditor。六、文档生成与其他工具Documentation / Other Utilities6.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 CLIbuf.build代码生成、Lint、破坏性变更检测breaking change detection、格式化、调用 gRPC APIcurl 式、编辑器集成与 LSPWireshark/Ethereal 抓包插件code.google.com/p/protobuf-wireshark按.proto解析抓到的二进制流排查线上 wire 数据利器Java protobuf 的 JSON/XML/HTML 替代编码protobuf-java-formatcode.google.com、另一个 Java JSON 编解码器sijuv/protobuf-codecOracle PL SQL 插件protocol-buffer-plsqlC Builder 兼容版 protobufsaadware/protobuf-cppbuildernginx 的 Protobuf 模块dbcode/protobuf-nginxRSpec matchers 与 Cucumber 步骤定义protobuf_specprotoc-jar多平台可执行 JAR 与 Java API跨环境调用protocos72/protoc-jarPython 脚本在 protobuf 与 JSON 间互转NextTuesday/py-pb-convertersC 的 protobuf/JSON 互转库yinqiwen/pbjsonprotobuf-elJava EE7 EL 3.0 纯 Java ProtoBuf 解析器/Builderprotoc-gen-lint.proto文件 linterckaznochaprotobuf-dynamic程序化创建 protobuf schema 的动态 schema 库os72node-protoc-plugin在 Node.js 中编写 protoc 插件konsumerProfaneDB基于 Protocol Buffers 的数据库profanedb.gitlab.iohypothesis-protobuf基于 Hypothesis 的属性测试工具与消息生成器CurataEngprotolock防止.proto出现向后不兼容变更的 CLInilsliceoptional-grpc面向可测试微服务的 gRPCPythongo-protoparser解析.proto文件的 Go 包yoheimuta支持 proto2proto3protolint强制 protobuf 风格与惯例的工具yoheimuta配套 vscode-protolint、intellij-protolint、vim-protolintsuper-linter把 protobuf lint 作为 GitHub Actiongithub/super-linterprotoc-gen-fieldmask生成静态类型 fieldmask 路径的插件idododprotoc-gen-bq-schema生成 BigQuery schema 的 protoc 插件GoogleCloudPlatformprotobuf-decoder-explainer粘贴二进制 protobuf 后解码并逐字段解释的网页工具jamesdbrockgRPC Federation通过在.proto中写自定义 option 生成 gRPC servermercari/grpc-federationprotoboiler用模板从.proto生成样板代码的插件in4lio。可以推断这一类工具的共同主题是围绕.proto文件的治理lintprotolint、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_EXCEPTION0]关闭异常第 25-27 行并把.inl文本头文件单独放在:private目标中两者都按 BSD/公共域/许可证声明了licenses。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.ccJSON 解析src/google/protobuf/json/internal/lexer.cc 与 src/google/protobuf/json/internal/untyped_message.ccupb 内核upb/wire/decode_fast/field_string.c、upb/wire/internal/decoder.h、upb/text/internal/encode.hC 扩展打包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。这说明官方仓库处理第三方代码遵循两类模式小依赖用下载源码 仓库内 BUILD 规则注入核心路径依赖则直接 vendored 进 third_party/utf8_range/ 并纳入 fuzzthird_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、Kotlinjava/kotlin/、Rustrust/、Dart、Lualua/等其代码在本仓库可查证文档中标注 Google-official 的条目与之对应区分实现类与工具类语言实现第二节替换的是运行时RPC 框架第三节替换的是通信层构建插件第四节与 IDE/文档/lint 工具第五、六节通常可与官方实现叠加使用三者的引入风险递减警惕版本与特性差距官方 C 运行时正在向 upb 内核与 editions 体系演进见 upb/、editions/、hpb/ 目录第三方库对字段 presencedocs/field_presence.md、JSON mappingdocs/options.md等新语义的跟进速度不一选型前应以目标库的.proto特性覆盖度为准Inactive 即弃用文档 RPC 一节的 Inactive 清单大量 code.google.com 项目不应再用于任何新项目其中部分项目如 protobuf-net已迁移到新地址并被收录到活跃清单中引用旧文章时需比对两者。【免费下载链接】protobufProtocol Buffers - Googles data interchange format项目地址: https://gitcode.com/GitHub_Trending/pr/protobuf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表