【入门系列】RPC框架初探 | 青训营笔记

138 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。

前言:单人工作固然容易,只需要将要做的事情列出来就行了。不过一个人的力量终究是有限的,所以就需要更多人进行协同工作。在协同的环境下,沟通是第一道难关。当出现不同语言的协作者时,选择一套通用语言就变得尤为重要。在程序设计中,如果使用的是单设备,内存就可以解决。但如果是使用多台设备,如何建立通信就成为了问题。就客户端与服务端的通信大多使用HTTP,而最近大火的RPC框架让传输方式多了一个新的选择。RPC框架到底是什么?怎么使用RPC框架?希望这篇文章能找到答案。

RPC(Remote Process Call),翻译成中文就是远程过程调用。和本地调用的区别是RPC可以在不同的设备调用,除此之外和本地调用没有太大区别。相对于现在主流的HTTP,更上一层的RPC框架可以像在本地一样通过函数调用的方式实现功能。

现在流行的RPC框架有gRPC、Thrift、rpcx和Kitex。这篇文章会简单使用gRPC作为示例,使用的环境为ubuntu20.04。

1. 让RPC示例跑起来

首先我们需要下载安装相应的模块:

$ 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

更新golang的调用源以正确使用protoc:

$ export PATH="$PATH:$(go env GOPATH)/bin"

接下来会使用git下载gRPC的示例:

$ git clone -b v1.46.0 --depth 1 https://github.com/grpc/grpc-go

前往示例所在的目录并启动服务端:

$ cd grpc-go/examples/helloworld
$ go run greeter_server/main.go

调用客户端:

$ go run greeter_client/main.go

当调用完成并出现Greeting: Hello world时,就代表RPC服务调用成功了。

2. 添加新的接口

.proto文件接口声明文件,通过它可以生成对应的服务端函数与客户端函数。

修改Helloword/Helloworld.proto添加SayHelloAgain函数:

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // 新增接口
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

通过下面的命令就可以生成服务端和客户端文件:

$ protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld/helloworld.proto

接下来我们就可以添加函数的内部实现了:

// greeter_client/main.go
r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: *name})
if err != nil {
	log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
// greeter_server/main.go
func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	return &pb.HelloReply{Message: "Hello Again " + in.GetName()}, nil
}

接下来我们再通过调用服务端与客户端,并在调用客户端的时候添加name参数,如:

go run greeter_client/main.go --name=Alice

当出现2022/06/10 10:00:09 Greeting: Hello Again Alice时,恭喜你,你写的新接口成功了!