gRPC (Google Remote Procedure Call) 是一种高性能、跨语言的远程过程调用框架,它通过 Protocol Buffers(ProtoBuf)定义服务接口,并支持众多编程语言。gRPC 在分布式系统的开发中广泛应用,其高效的序列化和反序列化机制、基于 HTTP/2 的流控制和分块传输等一系列特性使其在网络传输方面有着明显的优势。
本文主要介绍在 Golang 中如何安装 gRPC,并编写一个简单的客户端和服务端示例代码。
在安装 gRPC 之前,需要先安装 Protocol Buffers 3。Protocol Buffers 是 gRPC 自动生成代码所需的工具,同时也是一个序列化数据的工具。
首先,下载 Protocol Buffers 3 的安装包,以 Mac OS 为例:
$ curl -OL https://github.com/google/protobuf/releases/download/v3.9.1/protobuf-all-3.9.1.zip $ unzip protobuf-all-3.9.1.zip $ cd protobuf-3.9.1
执行 configure、make、make install 即可安装 Protocol Buffers:
$ ./configure $ make $ sudo make install
安装完 Protocol Buffers 后,使用以下命令安装 Go 的 gRPC 和相关工具:
$ go get -u google.golang.org/grpc $ go get -u github.com/golang/protobuf/protoc-gen-go
ProtoBuf 文件用于定义服务接口和数据结构,并通过 gRPC 工具自动生成相应的代码(包括客户端和服务端代码)。
我们在此编写一个简单的示例,定义一个计算器服务接口,支持加法运算:
syntax = "proto3"; package calculator; service Calculator { rpc Add(AddRequest) returns (AddResponse) {} } message AddRequest { int32 left = 1; int32 right = 2; } message AddResponse { int32 sum = 1; }
在此示例中,定义一个名为 Calculator 的服务接口,包含一个 Add 方法,该方法接收一个 AddRequest 参数并返回一个 AddResponse 参数。
AddRequest 和 AddResponse 都是消息结构,分别包含两个 int32 类型的字段,表示加法的两个操作数和结果。
在编写 ProtoBuf 文件后,使用以下命令生成客户端和服务端代码:
$ protoc --go_out=plugins=grpc:. calculator.proto
此命令生成一个名为 calculator.pb.go 的 Go 文件,其中定义了计算器服务的客户端和服务端代码。
在生成客户端和服务端代码后,就可以开始编写实际的客户端和服务端了。
首先是服务端代码,我们创建一个名为 server.go 的文件,实现 Calculator 接口:
package main import ( "context" "log" "net" pb "calculator/calculator" "google.golang.org/grpc" ) type server struct{} func (s *server) Add(ctx context.Context, in *pb.AddRequest) (*pb.AddResponse, error) { sum := in.Left + in.Right return &pb.AddResponse{Sum: sum}, nil } const ( port = ":50051" ) func main() { lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterCalculatorServer(s, &server{}) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }
在此示例中,我们定义了一个名为 server 的结构体,实现了 Calculator 接口中的 Add 方法。Add 方法接收一个 AddRequest 参数,并计算两个操作数之和,返回一个 AddResponse 参数。
最后,通过 gRPC 框架提供的 RegisterCalculatorServer 方法将服务注册到 gRPC 服务器中,并启动 gRPC 服务器。
接下来编写客户端代码,我们创建一个名为 client.go 的文件,实现一个简单的通过计算器服务进行加法运算的例子:
package main import ( "context" "log" "os" "strconv" pb "calculator/calculator" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultName = "world" ) func main() { // Set up a connection to the server. conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewCalculatorClient(conn) // Contact the server and print out its response. left, err := strconv.Atoi(os.Args[1]) if err != nil { log.Fatalf("could not parse left operand: %v", err) } right, err := strconv.Atoi(os.Args[2]) if err != nil { log.Fatalf("could not parse right operand: %v", err) } r, err := c.Add(context.Background(), &pb.AddRequest{Left: int32(left), Right: int32(right)}) if err != nil { log.Fatalf("could not add: %v", err) } log.Printf("Sum: %d", r.Sum) }
在此示例中,我们创建了一个名为 client 的客户端对象,并通过 grpc.Dial 方法连接到服务器。然后,我们从命令行参数中解析出加法的两个操作数,并调用 Add 方法发送请求,得到服务器返回的结果并输出。
在两个文件都编写完毕后,使用以下命令编译并运行两个程序:
$ go build server.go $ go build client.go $ ./server
然后在另一个终端中执行以下命令运行客户端程序:
$ ./client 1 2
运行结果会输出计算结果 3。
以上就是 gRPC 在 Golang 中的安装和使用,通过 gRPC 编写高效的分布式系统将变得十分简单。
以上是grpc golang安装的详细内容。更多信息请关注PHP中文网其他相关文章!