使用grpcurl访问gRPC服务

 

     go或者python等调用java服务时需要通过grpc去调用,如何在jav项目中开启grpc服务可参考我的另一篇文档Spring项目实现grpc协议_zpflwy1314的博客-CSDN博客

grpcurl是一个命令行工具,使用它可以在命令行中访问gRPC服务,就像使用curl访问http服务一样。

准备: 在gRPC服务中注册reflection服务

gRPC服务是使用Protobuf(PB)协议的,而PB提供了在运行时获取Proto定义信息的反射功能。grpc-go中的"google.golang.org/grpc/reflection"包就对这个反射功能提供了支持。

这里以grpc-go官方的helloword为例,代码结构如下:

1
2
3
4
5
6
7
8
grpc-hello
├── go.mod
├── go.sum
├── main.go
└── proto
    ├── doc.go
    ├── helloworld.pb.go
    └── helloworld.proto

helloworld.proto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
syntax = "proto3";

package proto;

// The greeting service definition.
service Greeter {
    // Sends a greeting
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
    string name = 1;
}

// The response message containing the greetings
message HelloReply {
    string message = 1;
}

main.go:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import "fmt"
import "log"
import "net"
import "context"
import "grpc-hello/proto"
import "google.golang.org/grpc"
import "google.golang.org/grpc/reflection"

func main() {
	lis, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	server := grpc.NewServer()
	// 注册grpcurl所需的reflection服务
	reflection.Register(server)
	// 注册业务服务
	proto.RegisterGreeterServer(server, &greeter{})
	
	if err := server.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

type greeter struct {

}

func (*greeter) SayHello(ctx context.Context, req *proto.HelloRequest) (*proto.HelloReply, error) {
	fmt.Println(req)
	reply := &proto.HelloReply{Message: "hello"}
	return reply, nil
}

main.go的第19行,使用reflection.Register(server)注册了reflection服务。

grpcurl的安装和使用

在Mac OS下安装grpcurl:

1
brew install grpcurl

grpcurl使用如下示例如下:

查看服务列表:

1
2
3
grpcurl -plaintext 127.0.0.1:8080 list
grpc.reflection.v1alpha.ServerReflection
proto.Greeter

查看某个服务的方法列表:

1
2
grpcurl -plaintext 127.0.0.1:8080 list proto.Greeter
proto.Greeter.SayHello

查看方法定义:

1
2
3
grpcurl -plaintext 127.0.0.1:8080 describe proto.Greeter.SayHello
proto.Greeter.SayHello is a method:
rpc SayHello ( .proto.HelloRequest ) returns ( .proto.HelloReply );

查看请求参数:

1
2
3
4
5
grpcurl -plaintext 127.0.0.1:8080 describe proto.HelloRequest
proto.HelloRequest is a message:
message HelloRequest {
  string name = 1;
}

调用服务,参数传json即可:

1
2
3
4
grpcurl -d '{"name": "abc"}' -plaintext 127.0.0.1:8080  proto.Greeter.SayHello
{
  "message": "hello"
}

总结

grpcurl这个工具从使用上十分简单,查看服务信息基本上类似展示的proto文件的内容,调用服务这个功能还是很实用的,可以整好到k8s的Pod镜像中,用于在k8s集群内部简单测试gRPC服务。

推荐阅读:

https://segmentfault.com/a/1190000040761594

你可能感兴趣的:(学习,工具,golang,开发语言,后端)