考试通知
云原生后端微服务【免费下载链接】classicswarmSwarm Classic: a container clustering system. Not to be confused with Docker Swarm which is at https://github.com/docker/swarmkit项目地址https://gitcode.com/gh_mirrors/cl/classicswarm点击查看免费下载导读gogoprotobuf全称 Protocol Buffers for Go with Gadgets是 golang/protobuf 的一个增强型 fork通过额外代码生成特性为 Go 服务提供更快的编解码marshalling/unmarshalling、更规范的 Go 结构体、可选的辅助代码与测试/基准代码生成以及 JSON、Gogo 等更多序列化格式支持。本指南以仓库内 vendored 的 Readme.md 为骨架结合 proto 包源码 与仓库实际应用讲解如何选择三档代码生成方案、安装依赖、编写扩展与集成 gRPC并揭示其性能提升背后的实现原理。读完本文你将能在自己的项目中复刻这套按需定制生成的 protobuf 开发流程。适用前提以下命令与版本信息以本仓库 vendor.conf 锁定的 gogoprotobuf v0.4 及其 vendored 源码为准同时仓库还间接依赖 docker/docker v1.2.0、docker/swarmkit v1.0.0 两处 gogoprotobuf 副本见 docker 的 vendor.conf、swarmkit 的 vendor.conf。gogoprotobuf 是什么与 golang/protobuf 的关系gogoprotobuf 是 golang/protobuf 的 fork核心差异集中在代码生成层标准 golang/protobuf 生成的是通用、偏重反射的编解码代码gogoprotobuf 则针对每个 message 生成**定制化hand-written 风格**的Marshal、Unmarshal、Size方法避免运行时反射开销。官方 Readme 列出的目标能力包括更快的 marshalling / unmarshallingfast marshalling and unmarshalling更规范的 Go 结构more canonical Go structures与 goprotobuf 保持兼容goprotobuf compatibility可选生成额外辅助代码减少手写样板less typing by optionally generating extra helper code可选生成测试与基准代码带来安心peace of mind支持其他序列化格式other serialization formats。这些能力全部通过 protoc 插件protoc-gen-*在生成阶段完成运行时库则提供支撑函数。三档生成方案从 Speed 到 Most Speed and most customizationReadme 将使用方式划分为三档按生成代码量 × 定制深度 × 速度递进。核心思想是生成代码越多、越贴近你的真实字段布局运行时反射就越少编解码越快。第一档Speed ——protoc-gen-gofast仅追求最快的编解码不使用任何 gogo 扩展。go get github.com/gogo/protobuf/protoc-gen-gofast对.proto文件生成代码protoc --gofast_out. myproto.protoReadme 特别强调此档不允许使用其他 gogoprotobuf 扩展如gogoproto文件中的字段级选项。它生成的是纯加速版代码——不引入 gogoprotobuf 的 import也不生成扩展相关辅助方法。第二档More Speed and more generated code —— 三个二进制Readme 指出无指针字段可减少 GC 时间更多代码生成带来更便捷的方法。安装时需同时拉取 proto 运行库、对应生成器与扩展定义go get github.com/gogo/protobuf/proto go get github.com/gogo/protobuf/{binary} go get github.com/gogo/protobuf/gogoproto其中{binary}可取以下三个能力依次递增二进制说明特点protoc-gen-gogofast与 gofast 相同但 import 的是 gogoprotobuf可使用 gogo 扩展protoc-gen-gogofaster同 gogofast但不生成XXX_unrecognized指针字段更少更少指针 → 更少 GC 压力protoc-gen-gogoslick同 gogofaster额外生成String、GoString、Equal方法方便调试与比较使用方式protoc --gogofast_out. myproto.proto protoc --gogofaster_out. myproto.proto protoc --gogoslick_out. myproto.proto这三档生成器都允许使用 gogo 扩展见下文。第三档Most Speed and most customization ——protoc-gen-gogoReadme 的核心论点是将 message 字段定制为你实际使用的字段可以消除业务结构体 ↔ 序列化结构体之间的拷贝需求Customizing the fields of the messages to be the fields that you actually want to use removes the need to copy between the structs you use and structs you use to serialize。即通过gogoproto扩展让生成的结构体直接就是你的领域模型同时还能获得更多序列化格式与测试代码。安装go get github.com/gogo/protobuf/proto go get github.com/gogo/protobuf/jsonpb go get github.com/gogo/protobuf/protoc-gen-gogo go get github.com/gogo/protobuf/gogoproto生成protoc --gogo_out. myproto.proto当 .proto 文件使用了 gogo 扩展时还需要显式指定proto_path把 descriptor.proto 与 gogo.proto 所在目录纳入搜索路径。仓库 vendored 的 google protobuf 定义位于 protobuf/google/protobuf包含descriptor.proto、any.proto、duration.proto、timestamp.proto、field_mask.proto、wrappers.proto、struct.proto、empty.proto等官方 well-known types生成时可按需引用protoc --gogo_out. -I.:github.com/gogo/protobuf/protobuf *.proto常用 gogo 扩展速览gogoproto包github.com/gogo/protobuf/gogoproto以.proto扩展文件形式提供字段级/文件级选项常用包括(gogoproto.nullable) false把非重复字段从指针改为值类型消除指针开销这正是 gogofaster更少指针字段的原理(gogoproto.marshaler) true/(gogoproto.unmarshaler) true为 message 生成手写的Marshal/Unmarshal方法(gogoproto.sizer) true生成Size()方法配合MarshalTo实现先算大小、一次分配的两段式编码(gogoproto.goproto_stringer) false、(gogoproto.equal) true、(gogoproto.testgen) true、(gogoproto.benchgen) true控制生成String/Equal/测试/基准代码。环境与安装前提Readme 明确了两项硬性依赖Go至少 1.6.3官方持续测试 Go 1.7.1 与 1.8见 Readme Installation 一节。仓库 vendored 的运行时库源码注释同样要求at least Go 1.4见 README两个版本要求并不矛盾——前者针对当时的生成器工具链后者针对proto库本身。标准 protobuf 实现protoc C runtime从 google/protobuf 获取官方持续测试 2.6.1、3.0.2、3.1.0并注明 2.3.1 以上版本一般无问题。安装 protoc 后务必把生成器二进制go get默认安装到$GOBIN即$GOPATH/bin加入$PATH否则 protoc 无法找到protoc-gen-gogo等插件。生成代码的形态仓库内的真实样例仓库虽然没有在业务代码中直接 import gogoprotobuf但 vendored 的 plugin.pb.go 是protoc-gen-gogo生成的典型产物可直观验证上文原理文件头// Code generated by protoc-gen-gogo.与const _ proto.GoGoProtoPackageIsVersion2第 32 行标明生成器与运行时版本的契约message 生成手写Size()第 238 行、MarshalTo(dAtA []byte)第 124 行等方法先size : m.Size()再MarshalTo即两段式快速编码每个字段生成GetXxx()getter 方法nil 接收者也能安全返回默认值第 48-60 行。这种手写风格方法正是 gogoprotobuf 相对 golang/protobuf 反射式编解码的性能差异来源。配套的运行时实现可在 proto 包 中看到NewBufferlib.go提供可复用的编码缓冲encode_gogo.go、decode_gogo.go 提供 gogo 专属的编解码原语lib_gogo.go 提供MarshalJSONEnum等 JSON 序列化辅助函数。在 .proto 中声明与使用 gogo 扩展在.proto文件顶部导入扩展定义并声明go_packagesyntax proto3; package example; import github.com/gogo/protobuf/gogoproto/gogo.proto; option go_package example; message Item { // 值类型字段生成 struct 直接持有值无指针 option (gogoproto.nullable) false; string name 1; repeated int64 tags 2; }配合protoc-gen-gogo生成后Item的Name字段类型是string而非*string附带Marshal、Unmarshal、Size等手写方法若开启testgen/benchgen还会在同一目录生成*_test.go内含随机化构造、编解码往返round-trip校验与Benchmark函数可直接go test -bench .验证加速效果。生成参数ParametersReadme 中protoc-gen-go/gogo系列插件支持以冒号分隔、逗号连接的参数列表protoc --gogo_outpluginsgrpc,import_pathmypackage:. *.proto参数作用import_prefixxxx给所有 import 加上前缀适合在子目录中生成或原地重新生成 vendored protobufimport_pathfoo/bar当输入文件未声明go_package时用作包名含斜杠时仅取最右段之后的部分pluginsplugin1plugin2指定要加载的子插件列表本仓库内置的唯一子插件是grpcMfoo/bar.protoquux/shme声明某.proto文件对应的 Go 包受import_prefix影响集成 gRPCReadme 指出 gRPC 用法与 golang/protobuf 完全一致只需指定插件即可。以 gofast 为例protoc --gofast_outpluginsgrpc:. my.proto对于需要 gogo 扩展 gRPC 的组合protoc --gogo_outpluginsgrpc,import_pathmypackage:. -I.:github.com/gogo/protobuf/protobuf *.proto生成后服务端实现与客户端调用均使用标准grpc包message 编解码则走 gogo 手写方法——这也是 etcd、cockroachdb、dgraph、Docker swarmkit 等知名项目选择 gogoprotobuf 的常见组合Readme Users 一节列出的使用方包括 etcd、kubernetes、docker swarmkit、nats.io、tidb/tikv、pingcap 等。兼容性注意事项Readme含随库 README对兼容性给出明确边界库与生成代码长期稳定但保留在以下情形不预先通知的破坏性变更权利安全问题、规范中未定义行为、规范自身错误或变更、Bug 修复、向生成结构体新增方法/字段字段名冲突时生成器自动追加下划线、XXX_前缀字段的增删改、生成代码中未导出符号的增删改超出上述范围的破坏性变更会提前 6 个月在 protobufgooglegroups.com 公布版本契约通过包级常量GoGoProtoPackageIsVersion1/GoGoProtoPackageIsVersion2见 lib.go保证生成代码引用该常量若运行时库过旧则编译直接失败。因此应尽量让proto运行时库与protoc-gen-*生成器来自同一版本仓库 vendor 目录中的多份副本版本各不相同混用时需特别留意。小结三档方案的取舍本质是用生成时代码量换取运行时的反射消除gofast零扩展快速接入gogofast/gogofaster/gogoslick引入扩展与指针优化gogo全量定制让序列化结构体即业务结构体。实践中可按先--gogofaster_out获得无指针 无XXX_unrecognized的平衡方案再按需开启--gogoslick_out或自定义扩展的路径逐步深化。参考仓库内 plugin.pb.go 这类生成产物与 proto 包源码可以快速验证每项配置对生成代码形态的实际影响。赞分享云原生后端微服务【免费下载链接】classicswarmSwarm Classic: a container clustering system. Not to be confused with Docker Swarm which is at https://github.com/docker/swarmkit项目地址https://gitcode.com/gh_mirrors/cl/classicswarm点击查看免费下载相关推荐10分钟掌握gogoprotobuf终极Go语言协议缓冲区开发指南10分钟掌握gogoprotobuf终极Go语言协议缓冲区开发指南 想要在Go项目中实现 极速序列化 和 高性能通信 吗gogoprotobuf正是你需要的序列化eShop gRPC集成高性能服务间通信与协议缓冲区使用eShop gRPC集成高性能服务间通信与协议缓冲区使用 引言为什么选择gRPC 在现代微服务架构中服务间通信的性能和效率至关重要。传统的REST AP后端电商前端微服务洛雪音乐音源架构深度解析多平台聚合与音质分级技术方案洛雪音乐音源架构深度解析多平台聚合与音质分级技术方案 洛雪音乐音源项目通过创新的多平台聚合架构和智能音质分级技术为音乐爱好者提供了一套完整的高品质音乐获取解音视频上一篇NumPy CPU Dispatcher 工作原理基于多源编译的 SIMD 指令集动态调度机制下一篇MXNet np.random 模块完全指南NumPy 兼容随机采样与 GPU 加速概率分布创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
gogoprotobuf 使用指南:用 Gadgets 生成高性能 Go 协议缓冲代码
NEXT STEP
看完公告,下一步怎么走?
把报考交给靠谱的人:材料预审、批次抢报、考前辅导、复审提醒,全程有人跟。