Golang - RPC与gRPC入门(上)

383 阅读2分钟

RPC

RPC(Remote Procedure Call)远程过程调用,用于构造基于客户端-服务器的分布式应用程序。简单的来讲就是一个程序调用另外一台服务器的程序的过程,一般用于微服务架构中。

客户端-服务器之间的调用过程: image.png (图片来源于:www.geeksforgeeks.org/remote-proc…)

RPC的工作原理: rpc通信.png 在RPC期间将执行以下步骤:

  1. 客户端调用客户端Stub,以常规方式传递参数。客户端Stub驻留在客户端自己的地址空间中。
  2. 客户端Stub将参数封装(打包) 到消息中。打包处理包括将参数的表示形式转换为标准格式,并将每个参数复制到消息中。
  3. 客户端Stub将消息传递到传输层传输层将其发送到远程服务器计算机。
  4. 在服务器上,传输层将消息传递到服务器Stub,对压缩参数进行戒烟,并使用常规过程调用机制调用所需的服务器例程。
  5. 当服务器过程完成时,它返回到服务器Stub(例如,通过正常过程调用返回), 后者将返回值封送到消息中。然后,服务器Stub将消息传递给传输层。
  6. 传输层将结果消息发送回客户端传输层,客户端传输层将消息传递回客户端Stub
  7. 客户端Stub解绑返回参数,执行返回给调用方。

gRPC

gRPC是google公司封装的一个RPC框架,它支持多种语言,比如C++、Java、Go、Node、PHP、Python等多种语言。gRPC是采用Protocol Buffers进行序列化和反序列化的

实践

  1. 首先按照gRPC官网的快速指南来,下载Go安装包go1.18.4.windows-amd64.msi, 配置GOROOT和GOPATH环境变量
  2. 下载Protocol buffer,这里最新版的是protoc-21.2-win64.zip, 解压到一个目录,然后配置环境变量
  3. 安装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
  1. 安装grpc 需要用go mod管理依赖
go get google.golang.org/grpc
  1. 编写一个简单的hello.proto
syntax="proto3";


package hello;

message Req {
  string message = 1;
}

message Res {
  string message = 1;
}

service HelloGRPC {
  rpc SayHi(Req) returns (Res);
}
  1. 编译运行
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