0. 概述
在之前的 Protobuf 工具篇:玩转 Protobuf 中我介绍了一种可以作为客户端的 protobuf 工具,但是,今天我要介绍另外一款不太一样工具,它可以查看 GRPC 服务中的方法,并且也可以在命令行中调用这个方法。
这个工具名字为 grpcurl,是一个非官方的工具,它的用途正如其名,就是让你可以想 http 一样使用 curl 来调用和调是 GRPC,在这篇文章中,我将向你展示一下,如何使用这个项目和工具。
1. 环境准备
要想使用 grpccurl,第一步肯定是要先安装啦,因为我是使用 Go 环境的,所以可以直接用 go install
安装,如果你使用其他环境,可以从 Release 中下载。
[root@liqiang.io]# go get github.com/fullstorydev/grpcurl
[root@liqiang.io]# go install github.com/fullstorydev/grpcurl/cmd/grpcurl
当工具安装完之后,在尝试使用之前,我们得先有个 GRPC 服务,所以你可以从我的示例中获取:代码下载,然后运行起来:
[root@liqiang.io]# git clone https://github.com/liqiangblogdemos/grpc-sample.git
[root@liqiang.io]# cd grpc-sample
[root@liqiang.io]# go run server/main.go
Listen at localhost:8123
现在就已经运行起了一个 GRPC Server 了,接着就可以使用 grpccurl 工具了。默认得,grpccurl 是使用 TLS 的,如果你想使用普通的 tcp 连接,那么得加上参数 --plaintext
,所以后面你都会看到这个参数。
2. 查看元数据
第一个 grpccurl 的演示功能就是如何查看所有的服务:
[root@liqiang.io]# grpcurl -plaintext localhost:8123 list
TestService
grpc.reflection.v1alpha.ServerReflection
可以看到,通过 list 子命令可以查看到服务器中暴露出来的服务,需要注意的是,默认的 grpc 服务器是不能使用这条命令的,需要在代码中额外加上一行代码:
[root@liqiang.io]# cat main.go
... ...
reflection.Register(s)
... ...
这样你才能让 grpccurl 识别到你的服务。接着我要演示一下如何查看服务里面的方法:
[root@liqiang.io]# grpcurl -plaintext localhost:8123 list TestService
TestService.GetFiles
TestService.Ping
可以看到,直接在 list 子命令中加上对应的服务名,就可以看到对应的服务提供什么方法,既然方法可以知道,那么在调用它之前得知道它得参数和返回值组成之类的,所以还需要再继续看详情:
[root@liqiang.io]# grpcurl -plaintext localhost:8123 describe TestService.Ping
TestService.Ping is a method:
rpc Ping ( .google.protobuf.Empty ) returns ( .google.protobuf.Empty );
OK,这样就在不查看 proto 的情况下把一个服务的底细给摸清楚了。
3. 命令调用
下一步,就是尝试用命令行调用一个 GRPC 方法了:
[root@liqiang.io]# grpcurl -plaintext localhost:8123 TestService/Ping
{
}
OK,一切正常,如果你想要传递参数的话(当然,这个例子里面没有参数),你需要加上 -d
参数,例如这样:
[root@liqiang.io]# grpcurl -plaintext -d '{"value": {"author": "https://liqiang.io"}}' localhost:8123 TestService/Ping
但是,在这个例子里,这里无意义。
4. 小结
在这篇文章中,我介绍了 grpccurl 这个工具的环境准备,以及如何安装这个工具,如何用这个工具获取 GRPC 服务的元数据,还有如何通过命令行去调用它。