关于RPC(Remote Procedure Call)
的定义,可以参考这两篇文章:Remote procedure call和Remote Procedure Call (RPC)。简单来讲,RPC
指的就是一个进程(client
)发起一个函数调用,但是实际用来执行这个函数调用是另一个进程(server
)。这个函数调用会阻塞在那里,直到收到响应。Server
进程可以与client
进程可以位于同一台机器也可以是不同机器。Client
和server
都有一个stub
模块,client
的stub
负责发送request
,并处理server
返回的response
;而server
的stub
则负责处理client
发送的request
,并返回response
。 通常,我们使用Interface Description Language来定义RPC
的消息格式。
gRPC
是google
实现的RPC
,其默认使用protocol buffers,一个使用gRPC
的例子如下(图出自Getting started):
以Go
语言为例,搭建gPRC
环境包括下列几步:
(1)安装gRPC runtime
:
go get google.golang.org/grpc
(2)安装protocol buffers
支持(包含compiler
和runtime
):从protocol buffers官网下载最新的源码包,解压缩:
./configure
make
make check
make install
ldconfig
(3)安装Go protoc plugin
:
go get -a github.com/golang/protobuf/protoc-gen-go
参考gRPC
提供的例子,下载helloworld.proto
文件,然后在当前目录执行“protoc --go_out=plugins=grpc:. *.proto
”就会在当前目录下生成helloworld.pb.go
文件。对于client
来讲,发送request
的函数已生成好,只需直接传入request
内容以及option
即可:
type GreeterClient interface {
// Sends a greeting
SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
}
type greeterClient struct {
cc *grpc.ClientConn
}
func NewGreeterClient(cc *grpc.ClientConn) GreeterClient {
return &greeterClient{cc}
}
func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) {
out := new(HelloReply)
err := grpc.Invoke(ctx, "/helloworld.Greeter/SayHello", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
对于server
,定义好了interface
,需要自己实现满足这个interface
的结构体:
// Server API for Greeter service
type GreeterServer interface {
// Sends a greeting
SayHello(context.Context, *HelloRequest) (*HelloReply, error)
}
可以看出,SayHello()
函数只要实现如何构造response
即可,其它如何传输消息等等,均不用管。
为了熟悉这个流程,我自己做了一遍,代码在这里:https://github.com/NanXiao/helloworld。
有疑问加站长微信联系(非本文作者)