python下的grpc和protocol buffer体验

1、grpc简介

Github地址: https://github.com/grpc/grpc

  • gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。
  • 目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go。
  • 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。

2、protocol buffer简介

  • Protocol Buffer 其实是Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 强很多!

在这里插入图片描述

3、安装 grpc 和 tools

# 安装 grpc
python -m pip install grpcio -i https://pypi.doubanio.com/simple
# 安装 grpc tools
python -m pip install grpcio-tools -i https://pypi.doubanio.com/simple

4、protobuf 格式定义

文件: hello.proto

syntax = "proto3";

message HelloRequest{
    string name = 1; // name 表示名称 1 代表编号
}

5、生成proto的python文件

# 注意:必须进入到proto文件所在的目录
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto

# 说明:
# --python_out=. 指定生成python文件所在的目录
# --grpc_python_out=. 指定生成的grpc文件所在的目录
# -I. 指定proto文件所在的目录

6、protobuf简单测试

from protobuf_test import hello_pb2

request = hello_pb2.HelloRequest()
request.name = "jason"
res_str = request.SerializeToString()
print(res_str)  # b'\n\x05jason'

# 将字符串方向解析成对象
request2 = hello_pb2.HelloRequest()
request2.ParseFromString(res_str)
print(request2.name)  # jason

7、grpc开发体验

7.1 定义helloworld的proto配置文件,并使用工具命令生成python文件和rpc文件

syntax = "proto3";

service Greeter{
  rpc SayHello (HelloRequest)returns(HelloReply);
}

message HelloRequest{
  string name = 1;
}

message HelloReply{
  string message = 1;
}

7.2 使用tools生成python文件和rpc文件

python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. helloworld.proto

7.3 调整grpc文件引入包位置

使用工具自动生成的的rpc文件,默认导入包的位置是相对主目录,按需调整。

说明:在引入包的前面指定包路径
在这里插入图片描述

7.4 服务端

server.py

import grpc

from grpc_hello.proto import helloworld_pb2, helloworld_pb2_grpc
import futures


# 继承grpc生成后的GreeterServicer类
class Greeter(helloworld_pb2_grpc.GreeterServicer):
    # request 和 context 都是自动生成的 无需改动,可参考源文件
    def SayHello(self, request, context):
        return helloworld_pb2.HelloReply(message=f"你好,{request.name}")


if __name__ == "__main__":
    # 1.实例化server
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    # 2.注册逻辑到server中
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    # 3.启动服务
    server.add_insecure_port("[::]:50051")
    server.start()
    server.wait_for_termination()  # 注意添加,否则执行完主程序自动关闭

7.5 客户端

client.py

import grpc

from grpc_hello.proto import helloworld_pb2, helloworld_pb2_grpc

if __name__ == "__main__":
    # 建立连接
    with grpc.insecure_channel("127.0.0.1:50051") as channel:
        # 获取客户端stub
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        # 调用远程方法(helloworld_pb2.HelloReply为rsp的类型)
        rsp: helloworld_pb2.HelloReply = stub.SayHello(helloworld_pb2.HelloRequest(name="jason"))
        print(rsp.message)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JasonHome

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值