go-grpc使用
go-grpc使用
前篇
- grpc应用详解 - https://www.jishuwen.com/d/2BV4
- Go实践微服务 – gRPC配置和使用 - https://yuanxuxu.com/2018/06/20/go-microservice-in-action-grpc/
- gRPC 基础: Go - https://doc.oschina.net/grpc?t=60133
- https://github.com/micro/development/blob/master/clients.md
使用的 proto 的语法必须是3. ( syntax = "proto3";
)
安装
命令
1
$ go get -u -v google.golang.org/grpc
生成包含 grpc 的 pb
Go实战–golang中使用gRPC和Protobuf实现高性能api(golang/protobuf、google.golang.org/grpc) - https://blog.csdn.net/wangshubo1989/article/details/78739994
1
$ protoc --go_out=plugins=grpc:. your_pb.proto
单向调用
也就是 请求->响应 式的调用.
参考: grpc_call
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// proto
syntax = "proto3";
package helloworld;
service Greeter{
rpc SayHello (HelloRequest) returns (HelloReply){}
}
message HelloRequest{
string name = 1;
}
message HelloReply{
string message = 1;
}
// go
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
fmt.Printf("--- from cli, say:%s\n", in.Name)
return &pb.HelloReply{Message: "hello " + in.Name}, nil
}
双向调用
双方都可主动推送流过去
参考: grpc_stream_putget
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
37
38
39
40
41// proto
syntax = "proto3";//声明proto的版本 只能 是3,才支持 grpc
package pro;
service Greeter {
rpc AllStream (stream StreamReqData) returns (stream StreamResData){}
}
message StreamReqData {
string data = 1;
}
message StreamResData {
string data = 1;
}
// go
//客户端服务端 双向流, req res 都定义了 stream, 必须通过 recv 和 send 接收发送数据, 然后再通过 .xxx 获取属性值
func (this *server) AllStream(allStr pro.Greeter_AllStreamServer) error {
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
for {
data, _ := allStr.Recv()
log.Println("--- srv AllStream recv:", data.Data)
}
wg.Done()
}()
go func() {
for {
allStr.Send(&pro.StreamResData{Data: "--- srv data"})
time.Sleep(time.Second)
}
wg.Done()
}()
wg.Wait()
return nil
}