go grpc开发使用
1、安装proto
下载 Windows 版本
打开官方发布页面
访问 Protocol Buffers 的 GitHub Releases 页面:
👉 https://github.com/protocolbuffers/protobuf/releases
解压 ZIP 文件
将下载的 ZIP 文件解压到一个你容易找到的目录,例如:
C:\protoc\
解压后你会看到类似结构:
└── bin└── protoc.exe
└── include└── google\protobuf\...
将 protoc.exe 添加到系统 PATH 环境变量
- 按下 Win + S,搜索 “环境变量” → 选择 “编辑系统环境变量”。
- 点击 “环境变量” 按钮。
- 在 “系统变量” 区域,找到并选中 Path,点击 “编辑”。
- 点击 “新建”,然后添加 protoc.exe 所在的路径,例如
protoc --version# 出现类似这样的提示,说明安装成功
libprotoc 31.1
验证安装
2、小实例
编写proto文件user.proto
syntax = "proto3";//版本
package user; //默认包
option go_package ="./user"; //包名service User{//定义rpc方法rpc GetUser(UserRequest) returns (UserResponse);}
//消息体,可以看成结构体
message UserRequest{// 属性的类型,属性名=标识符string id = 1;
}message UserResponse{string id = 1;string name = 2;string phone = 3;
}
服务端
package mainimport ("context""fmt""go_collect/grpc/proto/user""google.golang.org/grpc""net"
)type UserServer struct {user.UnimplementedUserServer
}func (u *UserServer) GetUser(cxt context.Context, req *user.UserRequest) (*user.UserResponse, error) {res := &user.UserResponse{Id: "1",Name: "张三",Phone: "13812345678",}return res, nil
}
func main() {listen, err := net.Listen("tcp", ":8088")if err != nil {fmt.Println("监听失败", err)return}server := grpc.NewServer()user.RegisterUserServer(server, new(UserServer))fmt.Println("GRPC服务端,已经启动了!")server.Serve(listen)
}
客户端
package mainimport ("context""fmt""go_collect/grpc/proto/user""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"
)func main() {// Dial参数 第一个是地址,第二个数据是否加密conn, err := grpc.Dial("127.0.0.1:8088", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println("客户端远程连接失败")return}defer conn.Close()userClient := user.NewUserClient(conn)// 调用方法res, err := userClient.GetUser(context.Background(), &user.UserRequest{Id: "1",})if err != nil {fmt.Println("客户端调用远程方法失败")return}fmt.Println(res)}
编译命令
编译命令
protoc --go-grpc_out=:. --go_out=. ./user.proto
参数 | 功能 |
---|---|
protoc | Protocol Buffers 的官方编译器,用于将 .proto 文件编译成目标语言的源代码 |
–go-grpc_out=:. | 指定生成 gRPC 服务的 Go 代码(即服务端和客户端的 stub),*_grpc.pb.go 文件 |
–go_out=. | 生成 Protocol Buffers 消息结构体的 Go 代码(即数据结构、序列化/反序列化方法),*.pb.go |
./user.proto | 指定输入的 .proto 文件路径。 |
项目结构
启动服务端
客户端获取
protobuf 底层数据实现原理
grpc服务链接原理分析