Go gRPC 简介
gRPC 是由 Google 开源的基于 HTTP/2 协议的开源远程过程调用(RPC)框架,使用 Protocol Buffers 序列化协议。相比于传统的 HTTP+JSON 的通信方式,gRPC 更轻量、更快速,拥有更多的优点。
Go gRPC 安装
首先,你需要安装Go gRPC环境。可以打开你的终端,输入以下命令进行安装:
go get -u google.golang.org/grpc
安装完成后,你需要安装 Protocol Buffer 编译器。:
mac
brew install protobuf
CentOS
yum install -y protobuf
protoc --version
Ubuntu
apt install -y protobuf-compiler
protoc --version # Ensure compiler version is 3+
接下来,你需要安装 Go 的 Protocol Buffer 插件。可以使用以下命令安装:
go get -u github.com/golang/protobuf/protoc-gen-go
Go gRPC 开发
准备工作
一般来说,gRPC 包含服务端和客户端两部分。服务端主要包含 Proto 文件定义和服务实现;客户端主要包含服务调用和响应处理。
在开始之前,我们需要做一些准备工作:
定义 protobuf文件
首先,我们需要定义protobuf文件。protobuf是一种跨平台、语言无关的序列化协议,它能够将数据结构转换成二进制格式,以实现基于TCP、UDP等协议的跨服务通信, 通常以.proto
结尾
protobuf 文件是 gRPC 的核心部分,用于描述服务所需要的数据类型、请求参数和服务方法等信息, 新建一个文件 example.proto
syntax = "proto3";
package example;
message Message {
string data = 1;
}
service Greeter {
rpc SayHello (Message) returns (Message) {};
}
在该示例中,protobuf 文件定义了一个名为 example 的包,包含了一个名为 Message 的消息类型,以及一个名为 Greeter 的服务,该服务中包含了一个名为 SayHello 的方法。
生成go代码
接下来,我们将使用 protocol buffer 编译器 protoc 命令将刚刚新建的文件编译成 Go 代码。打开终端,输入以下命令:
$ protoc -I. --go_out=plugins=grpc:. ./example.proto
该命令将根据 example.proto 文件生成一个名为 example.pb.go 的 Go 代码文件,并将 grpc 标志作为参数传递,以支持 gRPC 功能。
实现服务端
在服务端,我们需要在 gRPC 的基础上实现我们的服务。以下是一个简单的示例:
package main
import (
"context"
"net"
"google.golang.org/grpc"
"example.pb" // 引入刚刚生成的
)
type server struct{}
func (s *server) SayHello(ctx context.Context, in *example.Message) (*example.Message, error) {
return &example.Message{Data: "Hello " + in.GetData()}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
panic(err)
}
s := grpc.NewServer()
example.RegisterGreeterServer(s, &server{})
if err := s.Serve(lis); err != nil {
panic(err)
}
}
在该示例中,我们定义了一个名为 server 的结构体,该结构体实现了 example.GreeterServer 接口中的 SayHello 方法,该方法会接收一个名为 Message 的请求,并返回一个 Message 类型的响应。
实现客户端
在客户端,我们需要调用服务端的服务,并处理服务端的响应。以下是一个简单的示例:
package main
import (
"context"
"log"
"google.golang.org/grpc"
"example.pb" // 引入刚刚生成的
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
c := example.NewGreeterClient(conn)
response, err := c.SayHello(context.Background(), &example.Message{Data: "World"})
if err != nil {
panic(err)
}
log.Printf("Response: %s", response.GetData())
}
在该示例中,我们使用 grpc.Dial 方法连接服务端,创建了一个名为 GreeterClient 的客户端,然后调用了 SayHello 方法。
启动服务端和客户端
现在,我们已经完成整个项目的代码编写,可以开始启动服务端和客户端了。首先,我们需要在终端中启动服务端:
go run server.go
接下来,在另一个终端中启动客户端:
go run client.go
如果一切顺利,你应该可以在客户端终端中看到以下信息:
Response: Hello World
结论
Go gRPC 是一个快速、轻量、高效、易于使用的RPC框架,能够提供出色的性能和灵活性,在 Go Web 开发中应用广泛。本文介绍了 Go gRPC 的安装、开发和使用方法,并通过一个简单的示例来展示了如何在 Go 中使用 gRPC。