grpcurl使用
grpcurl是一个命令行工具,使用它可以在命令行中访问gRPC服务,就像使用curl
访问http服务一样。
准备: 在gRPC服务中注册reflection服务 #
gRPC服务是使用Protobuf(PB)协议的,而PB提供了在运行时获取Proto定义信息的反射功能。grpc-go中的"google.golang.org/grpc/reflection"
包就对这个反射功能提供了支持。
这里以grpc-go官方的helloword为例,代码结构如下:
1grpc-hello
2├── go.mod
3├── go.sum
4├── main.go
5└── proto
6 ├── doc.go
7 ├── helloworld.pb.go
8 └── helloworld.proto
helloworld.proto:
1syntax = "proto3";
2
3package proto;
4
5// The greeting service definition.
6service Greeter {
7 // Sends a greeting
8 rpc SayHello (HelloRequest) returns (HelloReply) {}
9}
10
11// The request message containing the user's name.
12message HelloRequest {
13 string name = 1;
14}
15
16// The response message containing the greetings
17message HelloReply {
18 string message = 1;
19}
main.go:
1package main
2
3import "fmt"
4import "log"
5import "net"
6import "context"
7import "grpc-hello/proto"
8import "google.golang.org/grpc"
9import "google.golang.org/grpc/reflection"
10
11func main() {
12 lis, err := net.Listen("tcp", ":8080")
13 if err != nil {
14 log.Fatalf("failed to listen: %v", err)
15 }
16
17 server := grpc.NewServer()
18 // 注册grpcurl所需的reflection服务
19 reflection.Register(server)
20 // 注册业务服务
21 proto.RegisterGreeterServer(server, &greeter{})
22
23 if err := server.Serve(lis); err != nil {
24 log.Fatalf("failed to serve: %v", err)
25 }
26}
27
28type greeter struct {
29
30}
31
32func (*greeter) SayHello(ctx context.Context, req *proto.HelloRequest) (*proto.HelloReply, error) {
33 fmt.Println(req)
34 reply := &proto.HelloReply{Message: "hello"}
35 return reply, nil
36}
在main.go
的第19行,使用reflection.Register(server)
注册了reflection
服务。
grpcurl的安装和使用 #
在Mac OS下安装grpcurl:
brew install grpcurl
grpcurl使用如下示例如下:
查看服务列表:
1grpcurl -plaintext 127.0.0.1:8080 list
2grpc.reflection.v1alpha.ServerReflection
3proto.Greeter
查看某个服务的方法列表:
1grpcurl -plaintext 127.0.0.1:8080 list proto.Greeter
2proto.Greeter.SayHello
查看方法定义:
1grpcurl -plaintext 127.0.0.1:8080 describe proto.Greeter.SayHello
2proto.Greeter.SayHello is a method:
3rpc SayHello ( .proto.HelloRequest ) returns ( .proto.HelloReply );
查看请求参数:
1grpcurl -plaintext 127.0.0.1:8080 describe proto.HelloRequest
2proto.HelloRequest is a message:
3message HelloRequest {
4 string name = 1;
5}
调用服务,参数传json即可:
1grpcurl -d '{"name": "abc"}' -plaintext 127.0.0.1:8080 proto.Greeter.SayHello
2{
3 "message": "hello"
4}