这是我参与「第三届青训营 -后端场」笔记创作活动的的第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时,恭喜你,你写的新接口成功了!