下载Protocol Buffers编译器
并且配置到环境变量
编写product.proto
// 指定proto版本
syntax = "proto3";
package service;
message ProductRequest{
int32 prod_id = 1;
}
message ProductResponse{
int32 prod_stock = 1;
}
service ProdService{
rpc GetProduceStock(ProductRequest) returns(ProductResponse);
}
安装python相关库
python -m pip install grpcio
python -m pip install grpcio-tools
生成proto的python文件
# --python_out 生成的python文件放在那里
# --grpc_python_out 生成的grpc文件放在哪里
# -I 即 -Input 表示输入文件位置
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. product.proto
此时会生成 **product_pb2.py ** 和 product_pb2_grpc.py
编写python服务端代码
from concurrent import futures
import grpc
import product_pb2, product_pb2_grpc
class Producter(product_pb2_grpc.ProdServiceServicer):
def GetProduceStock(self, request, context):
prod_id = request.prod_id
return product_pb2.ProductResponse(prod_stock=2 * prod_id)
if __name__ == '__main__':
# 实例化 server 线程池数量为10
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# Producter 注册逻辑到 server 中
product_pb2_grpc.add_ProdServiceServicer_to_server(Producter(), server)
# 启动 server
server.add_insecure_port('[::]:50053')
server.start()
server.wait_for_termination()
安装Golang相关库
go get -u google.golang.org/protobuf/cmd/protoc-gen-go
go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc
生成proto的Golang文件
protoc --go_out=. --go-grpc_out=. product.proto
编写Golang客户端代码
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"grpc_client/service"
"log"
)
func main() {
// 连接 创建端口 和 证书
conn, err := grpc.Dial("[::]:50053", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil{
log.Fatal("连接失败", err)
}
// 退出时关闭连接
defer conn.Close()
// 创建客户端
productServiceClient := service.NewProdServiceClient(conn)
// 客户端创建请求
resp, err := productServiceClient.GetProduceStock(context.Background(), &service.ProductRequest{ProdId: 233})
if err != nil{
log.Fatal("调用GRPC方法错误", err)
}
fmt.Println("调用成功,prodStock=", resp.ProdStock)
}