【开源实现】Golang如何使用GRPC实现高效的远程调用?
在分布式系统中,服务间的远程调用是很常见的。GRPC是Google开源的一个高性能、开放源代码的RPC框架,可用于构建跨语言的客户端和服务器系统。
本文将详细介绍Golang如何使用GRPC实现高效的远程调用。
一、安装GRPC及相关依赖
安装GRPC需要同时安装protobuf、protoc-gen-go、grpc-go等依赖。
1. 安装protobuf
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protobuf-all-3.17.3.tar.gz
$ tar -zxvf protobuf-all-3.17.3.tar.gz
$ cd protobuf-all-3.17.3
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig
2. 安装protoc-gen-go
$ go get -u github.com/golang/protobuf/protoc-gen-go
3. 安装grpc-go
$ go get -u google.golang.org/grpc
二、定义protobuf文件
在GRPC中,需要定义protobuf文件来定义服务和消息。下面是一个简单的示例:
syntax = "proto3";
package demo;
// 定义HelloService服务
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
// 定义HelloRequest消息
message HelloRequest {
string name = 1;
}
// 定义HelloResponse消息
message HelloResponse {
string message = 1;
}
三、生成代码
在定义protobuf文件后,需要使用protoc命令生成Golang代码。
$ protoc --go_out=plugins=grpc:. *.proto
生成的文件包括了服务端和客户端的代码。
四、实现服务端
在服务端实现中,需要实现HelloService服务。
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "github.com/demo/demo"
)
type server struct{}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: "Hello " + req.GetName()}, nil
}
func main() {
lis, err := net.Listen("tcp", ":8888")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterHelloServiceServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
五、实现客户端
在客户端实现中,需要使用GRPC连接服务端,并调用HelloService服务。
package main
import (
"context"
"log"
"google.golang.org/grpc"
pb "github.com/demo/demo"
)
func main() {
conn, err := grpc.Dial(":8888", grpc.WithInsecure())
if err != nil {
log.Fatalf("failed to connect: %v", err)
}
defer conn.Close()
c := pb.NewHelloServiceClient(conn)
resp, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "world"})
if err != nil {
log.Fatalf("failed to call: %v", err)
}
log.Printf("message: %s", resp.Message)
}
六、运行程序
运行服务端程序:
$ go run server.go
运行客户端程序:
$ go run client.go
输出结果为:
2021/07/27 10:30:49 message: Hello world
七、总结
本文介绍了Golang如何使用GRPC实现高效的远程调用。我们需要安装GRPC及相关依赖,并定义protobuf文件来定义服务和消息。然后使用protoc命令生成Golang代码,并实现服务端和客户端程序来进行远程调用。相比于HTTP的RESTful API,GRPC在效率、安全性和可扩展性方面都有很大的优势。