fullstorydev/grpcurl

GitHub: fullstorydev/grpcurl

grpcurl 是一款命令行工具,让开发者能够像使用 curl 调试 HTTP 接口一样便捷地与 gRPC 服务器交互、调用方法和浏览服务定义。

Stars: 12744 | Forks: 570

# gRPCurl [![Build Status](https://circleci.com/gh/fullstorydev/grpcurl/tree/master.svg?style=svg)](https://circleci.com/gh/fullstorydev/grpcurl/tree/master) [![Go Report Card](https://goreportcard.com/badge/github.com/fullstorydev/grpcurl)](https://goreportcard.com/report/github.com/fullstorydev/grpcurl) [![Snap Release Status](https://snapcraft.io/grpcurl/badge.svg)](https://snapcraft.io/grpcurl) `grpcurl` 是一个命令行工具,让你能够与 gRPC 服务器进行交互。它基本上就是针对 gRPC 服务器的 `curl`。 该工具的主要目的是从命令行调用 gRPC 服务器上的 RPC 方法。gRPC 服务器在传输中使用二进制编码([protocol buffers](https://developers.google.com/protocol-buffers/),或简称“protobufs”)。因此,使用常规的 `curl` 几乎无法与它们进行交互(当然,不支持 HTTP/2 的旧版本 `curl` 更是毫无可能)。 该程序接受使用 JSON 编码的消息,这对人类和脚本来说都要友好得多。 使用此工具,你还可以浏览 gRPC 服务的 schema,方式包括:查询支持[服务器反射](https://github.com/grpc/grpc/blob/master/src/proto/grpc/reflection/v1/reflection.proto)的服务器、读取 proto 源文件,或者加载编译后的“protoset”文件(包含编码后文件[descriptor protos](https://github.com/google/protobuf/blob/master/src/google/protobuf/descriptor.proto)的文件)。 事实上,该工具将 JSON 请求数据转换为二进制编码 protobuf 的方式正是使用了该 schema。因此,如果你交互的服务器不支持反射,你要么需要定义该服务的 proto 源文件,要么需要 `grpcurl` 可以使用的 protoset 文件。 本仓库还提供了一个库包 `github.com/fullstorydev/grpcurl`,其中包含的函数可以简化其他动态调用 gRPC endpoint 的命令行工具的构建。这段代码是展示如何使用 [protoreflect](https://godoc.org/github.com/jhump/protoreflect) 库的各种包以及它们的功能的绝佳示例。 另请参阅[2018 年 GopherCon 上的 `grpcurl` 演讲](https://www.youtube.com/watch?v=dDr-8kbMnaw)。 ## 功能 `grpcurl` 支持所有类型的 RPC 方法,包括流式方法。你甚至可以通过在交互式终端中运行 `grpcurl` 并使用 stdin 作为请求正文,来交互式地操作双向流式方法! `grpcurl` 同时支持安全/TLS 服务器*和*明文服务器(即无 TLS),并提供大量 TLS 配置选项。它还支持双向 TLS(mutual TLS),在这种情况下,客户端需要出示客户端证书。 如上所述,如果服务器支持反射服务,`grpcurl` 就可以无缝工作。如果不支持,你可以提供 `.proto` 源文件,或者向 `grpcurl` 提供 protoset 文件(包含由 `protoc` 生成的编译后描述符)。 ## 安装 ### 二进制文件 从 [releases](https://github.com/fullstorydev/grpcurl/releases) 页面下载二进制文件。 ### Homebrew (macOS) 在 macOS 上,可以通过 Homebrew 获取 `grpcurl`: ``` brew install grpcurl ``` ### Docker 对于支持 Docker 的平台,你可以下载一个允许你运行 `grpcurl` 的镜像: ``` # 下载 image docker pull fullstorydev/grpcurl:latest # 运行工具 docker run fullstorydev/grpcurl api.grpc.me:443 list ``` 请注意,使用 docker 时存在一些陷阱: - 如果你需要与监听主机环回网络的服务器进行交互,必须将主机指定为 `host.docker.internal` 而不是 `localhost`(适用于 Mac 或 Windows),*或者*使用 `-network="host"` 让容器使用主机网络(仅限 Linux)。 - 如果你需要提供 proto 源文件或描述符集,必须将包含这些文件的文件夹挂载为卷(`-v $(pwd):/protos`),并相应地将导入路径调整为容器路径。 - 如果你想通过 stdin 使用 `-d @` 选项提供请求消息,则需要在 docker 命令中使用 `-i` 标志。 ### 其他包 感谢第三方创建了相关的配方/包,还有许多其他安装 `grpcurl` 的方法。这包括在各种环境中安装 `grpcurl` 的其他方式,涵盖 Windows 和众多 Linux 发行版。 你可以在 *repology.org* 查看更多详细信息以及 `grpcurl` 的所有其他包的完整列表: https://repology.org/project/grpcurl/information ### Snap 你可以使用 snap 包安装 `grpcurl`: `snap install grpcurl` ### 从源码安装 如果你已经安装了 [Go SDK](https://golang.org/doc/install),可以使用 `go` 工具来安装 `grpcurl`: ``` go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest ``` 这会将命令安装到你的 `$GOPATH` 环境变量所指向位置的 `bin` 子文件夹中。(如果你没有设置 `GOPATH` 环境变量,默认安装位置是 `$HOME/go/bin`)。如果此目录已经在你的 `$PATH` 中,你就可以直接使用了。 如果你已经将此仓库拉取到不在 `$GOPATH` 中的位置,并且想要从源码构建,你可以 `cd` 进入该仓库,然后运行 `make install`。 如果你遇到编译错误,并且使用的是早于 1.13 版本的 Go SDK,可能是你的 `grpcurl` 依赖版本过时了。你可以通过运行 `make updatedeps` 来更新依赖。或者,如果你使用的是 Go 1.11 或 1.12,你可以在上述命令前加上 `GO111MODULE=on` 前缀,这也将使用正确的依赖版本进行构建(而不是你的 `$GOPATH` 中可能已有的任何版本)。 ## 用法 该工具的用法文档解释了众多选项: ``` grpcurl -help ``` 在下面的部分中,你将找到许多演示如何使用 `grpcurl` 的示例。 ### 调用 RPC 在受信任的服务器(例如,不带自签名密钥或自定义 CA 的 TLS)上调用不需要客户端证书且支持服务器反射的 RPC,是使用 `grpcurl` 最简单的操作。以下最小化调用会发送一个空的请求正文: ``` grpcurl grpc.server.com:443 my.custom.server.Service/Method # 无 TLS grpcurl -plaintext grpc.server.com:80 my.custom.server.Service/Method ``` 要发送非空请求,请使用 `-d` 参数。请注意,所有参数必须位于服务器地址和方法名称*之前*: ``` grpcurl -d '{"id": 1234, "tags": ["foo","bar"]}' \ grpc.server.com:443 my.custom.server.Service/Method ``` 如示例所示,提供的请求正文必须是 JSON 格式。该正文将被解析,然后以 protobuf 二进制格式传输到服务器。 如果你想在命令管道中包含 `grpcurl`,例如使用 `jq` 创建请求正文时,你可以使用 `-d @`,它会指示 `grpcurl` 从 stdin 读取实际的请求正文: ``` grpcurl -d @ grpc.server.com:443 my.custom.server.Service/Method <
标签:EVTX分析, Go, gRPC, Python工具, Ruby工具, SOC Prime, 底层编程, 开发工具, 接口测试, 日志审计, 网络调试, 自动化