RPC
RPC(Remote Procedure Call)远程过程调用,用于构造基于客户端-服务器的分布式应用程序。简单的来讲就是一个程序调用另外一台服务器的程序的过程,一般用于微服务架构中。
客户端-服务器之间的调用过程:
(图片来源于:www.geeksforgeeks.org/remote-proc…)
RPC的工作原理:
在RPC期间将执行以下步骤:
- 客户端调用客户端Stub,以常规方式传递参数。客户端Stub驻留在客户端自己的地址空间中。
- 客户端Stub将参数封装(打包) 到消息中。打包处理包括将参数的表示形式转换为标准格式,并将每个参数复制到消息中。
- 客户端Stub将消息传递到传输层,传输层将其发送到远程服务器计算机。
- 在服务器上,传输层将消息传递到服务器Stub,对压缩参数进行戒烟,并使用常规过程调用机制调用所需的服务器例程。
- 当服务器过程完成时,它返回到服务器Stub(例如,通过正常过程调用返回), 后者将返回值封送到消息中。然后,服务器Stub将消息传递给传输层。
- 传输层将结果消息发送回客户端传输层,客户端传输层将消息传递回客户端Stub。
- 客户端Stub解绑返回参数,执行返回给调用方。
gRPC
gRPC是google公司封装的一个RPC框架,它支持多种语言,比如C++、Java、Go、Node、PHP、Python等多种语言。gRPC是采用Protocol Buffers进行序列化和反序列化的
实践
- 首先按照gRPC官网的快速指南来,下载Go安装包go1.18.4.windows-amd64.msi, 配置GOROOT和GOPATH环境变量
- 下载Protocol buffer,这里最新版的是protoc-21.2-win64.zip, 解压到一个目录,然后配置环境变量
- 安装Protocol buffer编译插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
- 安装grpc
需要用
go mod
管理依赖
go get google.golang.org/grpc
- 编写一个简单的
hello.proto
syntax="proto3";
package hello;
message Req {
string message = 1;
}
message Res {
string message = 1;
}
service HelloGRPC {
rpc SayHi(Req) returns (Res);
}
- 编译运行
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./hello.proto
遇到一个问题如下
Please specify either:
• a "go_package" option in the .proto source file, or
• a "M" argument on the command line.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
需要在hello.proto
文件中写入option go_package="./;hello";
, 这里的go_package
有两部分组成,一部分是proto生成后的文件需要放在哪个目录
;另一部分是生成的包名是什么
参考链接
Remote Procedure Call (RPC) in Operating System
gRPC
Protocol Buffers