【Python小随笔】 Grpc协议的使用

发布时间 2023-12-13 14:00:49作者: PythonNew_Mr.Wang

定义接口

// test.proto

syntax = "proto3";
option cc_generic_services = true;


service Greeter {
  // 第一个接口
  rpc One(OneRequest) returns (OneResponse) {}
  // 第二个接口
  rpc Two(TwoRequest) returns (TwoResponse) {}

}


// 第1个接口 请求值
message OneRequest {
  string name = 1;
}

// 第1个接口 返回值
message OneResponse {
  string message = 1;
}


// 第2个接口 请求值
message TwoRequest {
  string age = 2;
}

// 第2个接口 返回值
message TwoResponse {
  string message = 2;
}

执行编译命令

python -m grpc_tools.protoc -I . --python_out=./  --pyi_out=./  --grpc_python_out=./  ./test.proto

创建服务端

# grpc_server.py

import test_pb2,test_pb2_grpc
import grpc
from concurrent import futures


# 继承生成的Server类做逻辑接口
class Greeter(test_pb2_grpc.GreeterServicer):
    """
        注意:
            这里函数的命名需要跟proto文件里面的接口名字一致
    """

    def One(self, request, context):
        # 第1个逻辑接口
        return test_pb2.OneResponse(message='Hello, ' + request.name)


    def Two(self, request, context):
        # 第2接口逻辑接口
        return test_pb2.TwoResponse(message='Goodbye, ' + request.name)

    
# 启动服务端
def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    test_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port('[::]:8800')
    server.start()
    print("启动成功,等待接受数据...")
    server.wait_for_termination()

if __name__ == '__main__':
    serve()

客户端

# grpc_client.py

import grpc
import test_pb2,test_pb2_grpc



def run():
    # 创建连接
    channel = grpc.insecure_channel('127.0.0.1:8800')
    # 创建客户端
    client = test_pb2_grpc.GreeterStub(channel)
    # 创建 传参值
    obj  = test_pb2.OneRequest(name="IM")
    # 请求接口
    response = client.One(obj)
    print("response",response)


if __name__ == '__main__':
    run()