0%

RPC系列(二)-gRPC入门

简单介绍gRPC和ProtoBuf,以及gRPC和ProtoBuf的安装和简单使用,并用golang实现简单RPC服务。

gRPC简介

gRPC 是由Google开发的远程过程调用开源框架,支持多种开发语言,且支持跨语言通信。是基于HTTP2通信协议标准设计开发,默认采用Protocol Buffers数据序列化协议。

安装

1
2
3
4
5
go get google.golang.org/grpc


go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

ProtoBuf简介

gRPC跨语言的支持都是通过Protocol Buffers这个东西,它是一个代码生成工具以及序列化工具。它可以把我们定义好的方法和数据结构转化成指定语言的代码。同时能将我们请求和响应的数据编码成gRPC能传输的形式,又能将数据序列化和反序列化成该语言能处理的形式。

安装

1
brew info protobuf

使用命令

这里不整理Protobuf文件的语法,Protobuf语法看这里。

1
2
3
protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/fileName.proto

protoc -I=$SRC_DIR --go-grpc_out=$DST_DIR $SRC_DIR/fileName.proto

$SRC_DIR : 待编译的proto文件所在目录

$DST_DIR:生成后的代码所存放的目录

简单示例

First: proto文件编写和生成源码

proto文件书写,先定义该通信用到的数据类型和结构,请求和响应的数据模型。

1
2
3
message Massage {
string request = 1;
}

再定义该通信的方法,只需要定义方法名、请求参数、响应参数即可。

1
2
3
service HelloService{
rpc Hello(Massage) returns (Massage);
}

通过protoc命名生成指定语言的代码,这里是生成go语言的代码。

1
2
protoc --go_out=. massage.proto
protoc --go-grpc_out=. massage.proto

Second: Server代码编写

HelloService方法的具体实现,这里简单实现。

1
2
3
4
5
func (h *helloService) Hello(c context.Context, requestMessage *protobuf.Massage) (responseMessage *protobuf.Massage, err error) {
msg := "hello " + requestMessage.Request
responseMessage = &protobuf.Massage{Request: msg}
return
}

创建rpc服务,注册通信方法的具体实现。

1
2
server := grpc.NewServer()
protobuf.RegisterHelloServiceServer(server, &service.HelloService)

监听端口,至此简单的rpc服务就写完了。

1
2
listen, err := net.Listen("tcp", "localhost:9000")
err = server.Serve(listen)

Third:Client代码编写

创建rpc客户端,建立连接。

1
2
conn, err := grpc.Dial("localhost:9000", grpc.WithInsecure())
c := protobuf.NewHelloServiceClient(conn)

发送请求信息以及读取响应信息。

1
2
requestMessage := &protobuf.Massage{Request: "world "}
responseMessage, err := c.Hello(context.Background(), requestMessage)

项目源码

1
git clone https://github.com/zhouxuwen/grpcdemo-go.git