jhump/protoreflect

GitHub: jhump/protoreflect

为 Go Protocol Buffers 和 gRPC 提供丰富的描述符反射、动态消息处理与动态 RPC 调用能力的工具库。

Stars: 1486 | Forks: 183

# Protocol Buffer 与 gRPC 反射 [![Build Status](https://circleci.com/gh/jhump/protoreflect/tree/v2.svg?style=svg)](https://circleci.com/gh/jhump/protoreflect/tree/v2) [![Go Report Card](https://goreportcard.com/badge/github.com/jhump/protoreflect)](https://goreportcard.com/report/github.com/jhump/protoreflect) 此仓库基于 [Go 的 Protobuf 运行时](https://pkg.go.dev/google.golang.org/protobuf/reflect/protoreflect) 中的反射功能构建, 同时也为 [gRPC](https://grpc.io/) 提供了反射 API。 [![GoDoc](https://pkg.go.dev/badge/github.com/jhump/protoreflect/v2.svg)](https://pkg.go.dev/github.com/jhump/protoreflect/v2) ## 描述符与反射工具 Protobuf Go 运行时中的 [`protoreflect`](https://pkg.go.dev/google.golang.org/protobuf/reflect/protoreflect) 包 提供了 `Descriptor` 接口及其实现,这些实现与各种描述符类型一一对应。 这些类型实际上是 [`descriptorpb`](https://pkg.go.dev/google.golang.org/protobuf/types/descriptorpb) 包中生成的 Protobuf 类型的智能包装器。 这些包装器让描述符变得*非常*有用且易于使用。 此仓库提供了一些额外的包,用于使用描述符并与之进行交互。 ``` import "github.com/jhump/protoreflect/v2/protoprint" ``` `protoprint` 包允许将描述符打印为 `.proto` 源文件。这实际上是 解析器/编译器(例如 [`protocompile`](https://pkg.go.dev/github.com/bufbuild/protocompile) 包)的逆过程。 与 `protobuilder` 包结合使用,这是一个以编程方式生成 protocol buffer 源代码的有用工具。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/protoprint)* ``` import "github.com/jhump/protoreflect/v2/protobuilder" ``` `protobuilder` 包允许以编程方式构建丰富的描述符。通常可以通过创建 descriptor proto 树并 使用 [`protodesc`](https://pkg.go.dev/google.golang.org/protobuf/reflect/protodesc) 包将它们链接为丰富的描述符,从而以编程方式构建描述符。 但是,构建有效的 descriptor proto 树绝非易事。 因此,该包提供了丰富的 API 来极大地简化这项任务。它还允许将 丰富的描述符转换为 builder,这意味着您可以通过编程方式修改/调整现有的描述符。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/protobuilder)* ``` import "github.com/jhump/protoreflect/v2/protoresolve" ``` `protoresolve` 包为多种 resolver 提供了命名接口。它还提供了一个 `Resolver` 接口,该接口充当各种 resolver 接口的联合体,并统一了 _descriptor_ resolver 和 _type_ resolver。前者返回 descriptor 实例;后者 返回类型(通常由 `dynamicpb` 包实现)。这些接口提供了一套全面的 类型集,用于解析 Protobuf schema 中的元素,并有效地 _扩展_ 了 Protobuf Go 运行时提供的 [`protoregistry`](https://pkg.go.dev/google.golang.org/protobuf/reflect/protoregistry) 包 中的 API。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/protoresolve)* ``` import "github.com/jhump/protoreflect/v2/protomessage" ``` `protomessage` 包包含一些辅助工具,用于从通用和/或动态代码中处理 `proto.Message` 实例。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/protomessage)* ``` import "github.com/jhump/protoreflect/v2/protodescs" ``` `protodescs` 包包含用于处理 descriptor 的各种辅助工具。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/protodescs)* ## 源代码信息 Go 中生成的 Protobuf 类型不包含“源代码信息”。源代码信息 是来自定义 message 的原始 Protobuf 源文件的数据,包括诸如 位置信息(即定义 message、enum 或 service 的文件名、行和列)以及注释等内容。 此仓库包含一些 API 来帮助处理源代码信息,并提供了一种机制(和 Proto 插件), 用于将源代码信息恢复到生成的 Go 代码中嵌入的 descriptor 里。 ``` import "github.com/jhump/protoreflect/v2/sourceinfo" ``` `sourceinfo` 包包含用于检索包含源代码信息的生成类型 descriptor 的 API。在生成 Go 代码时, 源代码信息不会被保留。但是,如果您还使用包含的 `protoc-gen-gosrcinfo` 插件生成代码, 并使用此包查询 descriptor,您就可以访问该信息。此信息最直接的用途 是向使用 gRPC 服务器反射服务的动态 RPC 客户端提供服务、方法和类型的注释。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/sourceinfo)* ``` import "github.com/jhump/protoreflect/v2/sourceloc" ``` `sourceloc` 包包含用于处理 `protoreflect.SourceLocation` 和 `protoreflect.SourcePath` 实例的辅助工具。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/sourceloc)* ## 动态 RPC Stub Protobuf Go 运行时中的 [`dynamicpb`](https://pkg.go.dev/google.golang.org/protobuf/types/dynamicpb) 包 提供了动态 message 实现。它实现了 `proto.Message`,但其底层由 message descriptor 和 field->value 的映射支持,而不是生成的结构体。这对于 通用化地处理 protocol buffer message 非常有用,而无需为每种 message 生成并链入 Go 代码。这对于需要操作任意 Protobuf schema 的通用工具尤其有用。这通过让工具在运行时加载 descriptor 成为可能。 此仓库在 `dynamicpb` 之上提供了相关功能,不仅可以动态使用 message schema, 还可以动态使用 RPC schema。这使得在没有任何用于被调用的 RPC service 的生成代码的情况下调用 RPC 成为可能。 ``` import "github.com/jhump/protoreflect/v2/grpcdynamic" ``` `grpcdynamic` 包提供了动态 stub 实现。该 stub 可用于 使用 method descriptor 而不是生成的客户端接口来发出 RPC 方法调用。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/grpcdynamic)* ## gRPC 服务端反射 ``` import "github.com/jhump/protoreflect/v2/grpcreflect" ``` `grpcreflect` 包提供了一个易于使用的 [gRPC 反射服务](https://github.com/grpc/grpc-go/blob/6bd4f6eb1ea9d81d1209494242554dcde44429a4/reflection/grpc_reflection_v1alpha/reflection.proto#L36) 客户端, 使得查询和使用远程服务的 schema 变得更加容易。 它还提供了一些辅助方法,用于为 gRPC 服务端中注册的 服务查询丰富的 service descriptor。 *[阅读更多 ≫](https://pkg.go.dev/github.com/jhump/protoreflect/v2/grpcreflect)*
标签:EVTX分析, Python工具, 日志审计