下载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)

}