gRPC基础教程总结
七篇阅读日记写完了,做个总结
从protocol buffers开始
基础教程的 .proto 文件routeguide/route_gudie.proto
protocol buffer除了定义好了消息中字段序列化的方式,还定义了服务双方的通信接口。
生成客户端和服务端的代码
除了在 .proto 文件中定义好上述内容后,还需要使用protoc工具编译,使用:
$ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ routeguide/route_guide.proto
生成两个文件,简而言之
- route_guide.pb.go: 生成了 proto 文件中定义的消息的结构体,相关填充,序列化方法
- route_guide_grpc.pb.go: 则是面向服务,定义了RPC服务需要实现的接口,还有一个重要的是,有一个客户端存根
type routeGuideClient struct { cc grpc.ClientConnInterface } func NewRouteGuideClient(cc grpc.ClientConnInterface) RouteGuideClient { return &routeGuideClient{cc}
这个在后续实现客户端的时候,创建client时需要使用
服务端和客户端的实现
这方面在以前阅读笔记已经详细的解读过了,如何实现,比如,客户端在处理Server-side流式请求,和服务端处理Client-side流式请求的实现上是有相似的地方的,都是在读到io.EOF的时候证明请求消息的读取,或是响应消息的读取已经完成了。
在 .proto 定义的rpc方法都需要实现。
外加经常重复的一句话就是,流式接口的请求喝接收,消息都是有顺序的,但客户端,喝服务端可以不按照消息顺序来处理(那这么说的话,也要按顺序返回吧)