protoc --go_out=./ --go-grpc_out=./ pm.proto
下载protobuf编译器 https://github.com/protocolbuffers/protobuf/releases
下载后解压到喜欢的目录,然后将此目录的bin加入到环境变量,如这里是D:\xx\go\go1\bin\protoc\bin,则将D:\xx\go\go1\bin\protoc\bin添加到环境变量
protobuf编译器的作用是将 .proto 文件,转译成protobuf的原生数据结构
安装插件
go get github.com/golang/protobuf/protoc-gen-go
此时会在GOPATH的bin目录下生成可执行文件.protobuf的编译器插件protoc-gen-go
执行protoc命令时就会自动调用这个插件
test/product/product.proto
syntax="proto3"; // 指定proto版本
package services;
option go_package = "../services;services"; // 前一个services指生成的go文件的存放目录,不存在会创建;后一个services是go文件的包名
// 定义一个消息类型ProductRequest
message ProductRequest{
int32 product_id = 1; // 定义字段product_id 是int32类型,标识号是1
}
message ProductRespones{
int32 product_stock = 1;
}
创建文件夹test/services
protoc --go_out=../services product.proto # 根据product.proto文件生成go文件,放到../services目录
protobuf语法 https://blog.csdn.net/weixin_42366378/article/details/105722792
grpc服务
test/product/product.proto
syntax="proto3";
package services;
option go_package = "../services;services"; // 前一个services指生成的go文件的存放目录,不存在会创建;后一个services是go文件的包名
message ProductRequest{
int32 product_id = 1;
}
message ProductRespones{
int32 product_stock = 1;
}
// 定义服务ProductService
service ProductService{
rpc GetProductStock(ProductRequest) returns (ProductRespones);
}
创建文件夹test/services
protoc --go_out=plugins=grpc:../services product.proto # 生成go文件
go get -u google.golang.org/grpc
test/services/productService.go
/*
* @description:
*/
package services
import (
context "context"
)
type ProductService struct {
}
// 实现 product.pb.go中的接口ProductServiceServer
func (this *ProductService) GetProductStock(ctx context.Context, in *ProductRequest) (*ProductRespones, error) {
return &ProductRespones{ProductStock: 20}, nil
}
test/server.go
/*
* @description:
*/
package main
import (
"net"
"test/services"
"google.golang.org/grpc"
)
func main() {
rpcServer := grpc.NewServer()
services.RegisterProductServiceServer(rpcServer, new(services.ProductService))
lis, _ := net.Listen("tcp", ":8081")
rpcServer.Serve(lis)
}
go run server.go
grpc客户端
把服务端生成的go文件复制到客户端来,把test/services/product.pb.go 复制到 grpccli/services/product.pb.go
grpccli/main.go
/*
* @description:grpc客户端
*/
package main
import (
"context"
"fmt"
"grpccli/services"
"log"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial(":8081", grpc.WithInsecure()) // 连接
if err != nil {
log.Fatal(err)
}
defer conn.Close()
productClient := services.NewProductServiceClient(conn)
productRes, err := productClient.GetProductStock(context.Background(),
&services.ProductRequest{ProductId: 1})
if err != nil {
log.Fatal(err)
}
fmt.Println(productRes.ProductStock)
}