新版Protobuf和gRPC的Golang实现变更
1 回复
更多关于新版Protobuf和gRPC的Golang实现变更的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
根据新版Protobuf和gRPC的Golang实现变更,主要需要关注以下升级步骤:
1. 依赖包变更
旧版使用github.com/golang/protobuf,新版迁移到google.golang.org/protobuf:
// 旧版导入
import "github.com/golang/protobuf/proto"
// 新版导入
import "google.golang.org/protobuf/proto"
2. protoc-gen-go插件变更
新版使用protoc-gen-go和protoc-gen-go-grpc两个独立插件:
# 安装新版插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
# 生成代码命令变更
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
your_service.proto
3. 生成的代码结构变化
新版将消息定义和gRPC服务定义分开生成:
// your_service.proto
syntax = "proto3";
package example;
service YourService {
rpc GetData(GetDataRequest) returns (GetDataResponse);
}
message GetDataRequest {
string id = 1;
}
message GetDataResponse {
string data = 1;
}
生成的文件结构:
your_service.pb.go # 消息定义
your_service_grpc.pb.go # gRPC服务定义
4. API使用示例
package main
import (
"context"
"log"
"google.golang.org/grpc"
"google.golang.org/protobuf/proto"
pb "your_module/example" // 生成的protobuf包
)
// 客户端使用
func callGRPC() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
defer conn.Close()
client := pb.NewYourServiceClient(conn)
// 创建请求消息
req := &pb.GetDataRequest{
Id: "123",
}
// 调用gRPC方法
resp, err := client.GetData(context.Background(), req)
if err != nil {
log.Fatal(err)
}
log.Printf("Response: %v", resp.GetData())
}
// Protobuf消息操作
func handleProtobuf() {
msg := &pb.GetDataRequest{Id: "test"}
// 序列化
data, err := proto.Marshal(msg)
if err != nil {
log.Fatal(err)
}
// 反序列化
newMsg := &pb.GetDataRequest{}
err = proto.Unmarshal(data, newMsg)
if err != nil {
log.Fatal(err)
}
}
5. 兼容性说明
新版API保持向后兼容,但建议逐步迁移。如果遇到编译问题,检查是否同时存在新旧两个版本的protobuf包。


