在这篇博客中,我讲一下如何用 Go 语言实现一个简单的 gRPC 服务端,包括必要的准备工作和基础操作。我们将使用 Protocol Buffers 定义服务接口,并实现加法和减法功能。
此篇文章服务于前两篇博客:
基于Vue3+Ts+Vite项目中grpc-Web的应用以及其中的坑
1. 前期准备
1.1 安装 Go
确保你的计算机上已经安装 Go 语言环境。可以通过以下命令检查 Go 的安装:
go version
1.2 安装 gRPC 和 Protocol Buffers
使用 Go 的包管理工具安装 gRPC 和 Protocol Buffers:
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
确保将 GOPATH/bin
添加到系统的环境变量中,以便使用 protoc-gen-go
和 protoc-gen-go-grpc
。
2. 定义 gRPC 服务
创建一个名为 calculation.proto
的文件,定义我们的 gRPC 服务和消息格式,注释可以见上面提到的第一篇文章:
syntax = "proto3";
package calculation;
option go_package = "./helloWorld;proto";
service CalculationService {
rpc Add(AddRequest) returns (AddResponse);
rpc Subtract(SubtractRequest) returns (SubtractResponse);
}
message AddRequest {
double num1 = 1;
double num2 = 2;
}
message AddResponse {
double result = 1;
}
message SubtractRequest {
double num1 = 1;
double num2 = 2;
}
message SubtractResponse {
double result = 1;
}
3. 生成 Go 代码
在终端中运行以下命令,使用 protoc
生成 Go 代码:
protoc --go_out=. --go-grpc_out=. calculation.proto
这将生成与 calculation.proto
文件对应的 Go 文件。
4. 实现 gRPC 服务端
创建一个名为 main.go
的文件,编写服务端代码:
package main
import (
"context"
"fmt"
proto "go-learn/protobuf/helloWorld" // 导入生成的 proto 包
"google.golang.org/grpc"
"net"
"strconv"
)
type Server struct {
proto.UnimplementedCalculationServiceServer // 嵌入未实现的结构体
}
// 实现 Add 方法
func (s Server) Add(ctx context.Context, request *proto.AddRequest) (*proto.AddResponse, error) {
fmt.Printf("Received Add request: %v\n", request)
return &proto.AddResponse{
Result: request.Num1 + request.Num2,
}, nil
}
// 实现 Subtract 方法
func (s Server) Subtract(ctx context.Context, request *proto.SubtractRequest) (*proto.SubtractResponse, error) {
fmt.Printf("Received Subtract request: %v\n", request)
return &proto.SubtractResponse{
Result: request.Num1 - request.Num2,
}, nil
}
func main() {
g := grpc.NewServer() // 创建 gRPC 服务器
proto.RegisterCalculationServiceServer(g, &Server{}) // 注册服务
lis, err := net.Listen("tcp", "0.0.0.0:8088") // 监听端口
if err != nil {
panic("failed to listen:" + err.Error())
}
err = g.Serve(lis) // 启动 gRPC 服务器
if err != nil {
panic("failed to start grpc:" + err.Error())
}
}
5. 运行 gRPC 服务端
在终端中,运行以下命令启动服务端:
go run main.go
6. 测试 gRPC 服务
可以通过文章一提到的前端接口来测试接口是否成功,也可以使用 gRPC 客户端工具(如 Postman、grpcurl 或自定义客户端)来测试我们的 gRPC 服务。
总结
在这篇博客中,可以了解了如何用 Go 语言实现一个简单的 gRPC 服务端,定义了加法和减法功能,并通过 Protocol Buffers 生成了相应的 Go 代码。这个基础示例可以为进一步扩展和应用 gRPC 提供了良好的基础。
目前go语言在自学中,后面会记录更多go语言相关内容。