gRPC工作原理gRPC是一个由Google开源的RPC框架
gRPC使用Protocol Buffer生成服务端&客户端存根 gRPC为什么高效在gRPC中客户端应用可以像调用本地对象的方法一样直接调用另一台不同机器上服务端应用的方法,使得我们能够更容易的创建分布式应用和服务。
gRPC基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个gRPC服务器来处理客户端的调用。在客户端拥有一个存根,它提供与服务器相同的方法或功能,存根由gRPC自动生成
- gRPC使用HTTP/2作为传输协议
vscode下载vscode-proto3插件
安装Go protocol buffers插件 执行 go install github.com/golang/protobuf/protoc-gen-go@latest
编译生成go文件 protoc --go_out=./go ./proto } Corpus corpus = 4; } 序列化&反序列化
package main import ( "encoding/json" "fmt" "grpc/user" "google.golang.org/protobuf/proto" ) func main() { article := &user.Article{ Aid: 1, Title: "protobuf for golang", Views: 100, } // 序列化为二进制数据 bytes, _ := proto.Marshal(article.ProtoReflect().Interface()) fmt.Printf("bytes: %vn", bytes) // 反序列化 otherArticle := &user.Article{} proto.Unmarshal(bytes, otherArticle.ProtoReflect().Interface()); fmt.Printf("otherArticle: %vn", otherArticle) }protobuf与json转换下载protojson go get google.golang.org/protobuf/encoding/protojson
package main import ( "fmt" "grpc/blog" "google.golang.org/protobuf/encoding/protojson" ) func main() { article := &blog.Article { Aid: 1, Title: "protobuf for golang", Views: 100, } // message to json jsonString := protojson.Format(article.ProtoReflect().Interface()) fmt.Printf("jsonString: %vn", jsonString) // json to message m := article.ProtoReflect().Interface() protojson.Unmarshal([]byte(jsonString), m) fmt.Printf("m: %vn", m) }protobuf定义服务生成带有 service 的pb.go文件 protoc --go_out=plugins=grpc:. ./proto/*.proto
syntax = "proto3" service UserService { rpc login(User) returns (User) {}; rpc register(User) returns (User) {}; }gRPC允许的四类服务方法
- 单项RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用
rpc SayHello(HelloRequest) returns (HelloResponse) {}
- 服务端流式RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse) {}
- 客户端流式RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端,一旦客户端完成消息写入,就等待服务端读取消息并返回应答
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {}
- 双向流式RPC,两边都可以通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse)gRPC示例引入依赖 :
go get -u google.golang.org/grpc
go install github.com/golang/protobuf/protoc-gen-go@latest
grpc-example



