这篇文章将介绍如何使用 Go 语言开发基于 Protocol Buffers (Proto 文件) 协议的 gRPC 服务器端(Server)和客户端(Client)。通过该文章使读者掌握基本的 gRPC Server、Client 开发步骤、工具和方法。
1. 安装开发工具
确保安装以下工具和库:
- Go 语言开发工具:正确配置 Go 语言开发环境
- Protocol Buffers Compiler (protoc):用于编译
.proto
文件 - gRPC 和 Protocol Buffers 的 Go 插件:用于生成 Server、Client 框架代码
go get google.golang.org/grpc
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
2. 创建 Proto 文件
创建一个 .proto
文件,定义消息结构和服务方法。例如,创建一个名为 example.proto
的文件,内容如下:
syntax = "proto3";
package example;
// 定义消息
message Request {
string name = 1;
}
message Response {
string message = 1;
}
// 定义服务
service Greeter {
rpc SayHello(Request) returns (Response);
}
3. 生成 Go 框架代码
使用 protoc
命令生成 Go 框架代码:
# --go_out 消息代码输出文件夹, --go-grpc_out gRPC代码输出文件夹
protoc --go_out=. --go-grpc_out=. example.proto
生成如下两个文件:
example.pb.go
:包含消息类型、结构定义及消息序列化/反序列化
example_grpc.pb.go
:包含 gRPC 服务的接口定义和实现
4. 实现 gRPC 服务器
使用上面生成的 Go 消息和服务代码实现 gRPC 服务器,创建一个 Go 文件(例如 server.go
)内容如下:
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "path/to/your/generated/package" // 替换为生成代码的实际包路径
)
// server 结构体实现了 GreeterServer 接口
type server struct {
pb.UnimplementedGreeterServer // 嵌入未实现的服务器
}
// 实现 SayHello 方法
func (s *server) SayHello(ctx context.Context, req *pb.Request) (*pb.Response, error) {
return &pb.Response{Message: "Hello " + req.Name}, nil
}
func main() {
// 创建 gRPC 服务器
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
// 监听端口
listener, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("Failed to listen: %v", err)
}
log.Println("Server is running on port :50051")
if err := s.Serve(listener); err != nil {
log.Fatalf("Failed to serve: %v", err)
}
}
5. 实现 gRPC 客户端
实现 gRPC 客户端,创建一个 Go 文件(例如 client.go
)内容如下:
package main
import (
"context"
"log"
"time"
"google.golang.org/grpc"
pb "path/to/your/generated/package" // 替换为生成代码的实际包路径
)
func main() {
// 连接到 gRPC 服务器
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("Did not connect: %v", err)
}
defer conn.Close()
client := pb.NewGreeterClient(conn)
// 设置超时
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
// 调用 SayHello 方法
response, err := client.SayHello(ctx, &pb.Request{Name: "World"})
if err != nil {
log.Fatalf("Could not greet: %v", err)
}
log.Printf("Response from server: %s", response.Message)
}
6. 运行服务器和客户端
- 运行 gRPC 服务器:
go run server.go
- 在另一个终端运行 gRPC 客户端:
go run client.go
总结
通过以上步骤,我们使用 Go 语言基于 Protocol Buffers 开发了完整的 gRPC 服务器端和客户端。读者可以参考上面介绍的工具、方法和步骤,实现自己的业务需求。