前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[799]python grpc

[799]python grpc

作者头像
周小董
发布2020-05-12 17:53:51
9340
发布2020-05-12 17:53:51
举报
文章被收录于专栏:python前行者

RPC

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

gRPC

gRPC是一个高性能、通用的开源RPC框架,其由Google主要由开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。

  • 基于HTTP/2协议提供了更好的强的应用性能(节省带宽,减少TCP请求连接数)
  • 基于ProtoBuf定义服务,面向接口对服务进行顶层设计
  • 支持主流的编程语言,C++,Java,Python,Go,Ruby,Node.js,PHP等, 基于ProtoBuf生成相应的服务端和客户端代码。
  • 相比在使用Restful方式完成服务之间的相互访问,GRPC能提供更好的性能,更低的延迟,并且生来适合与分布式系统。
  • 同时基于标准化的IDL(ProtoBuf)来生成服务器端和客户端代码, ProtoBuf服务定义可以作为服务契约,因此可以更好的支持团队与团队之间的接口设计,开发,测试,协作等等。

gRPC官网 https://www.grpc.io/docs/quickstart/python/ grpc-git:https://github.com/grpc/grpc

gRPC四种通信方式

根据不同的业务场景, grpc 支持 4 种通信方式:

客服端一次请求, 服务器一次应答 客服端一次请求, 服务器多次应答(流式) 客服端多次请求(流式), 服务器一次应答 客服端多次请求(流式), 服务器多次应答(流式)

protobuf

protocol buffers(简称protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平台。

  • protobuf是google开发的一个数据传输格式,类似json
  • protobuf是二进制的、结构化的,所以比json的数据量更小,也更对象化
  • protobuf不是像json直接明文的,这个是定义对象结构,然后由protbuf库去把对象自动转换成二进制,用的时候再自动反解过来的。传输对我们是透明的!我们只管传输的对象就可以了

protoc3官网

https://developers.google.com/protocol-buffers/docs/proto3

python-protobuf

  • 在python里也需要proto文件生成对应的代码,才能通过grpc/restful协议调后端的代码
  • pb其实就是协议格式/内容,restful/rpc是协议
  • 无关乎语言, 前端(python或go), 跟后端(go或者c++) 通信的时候,都要告知发送的内容的格式–这个格式就是pb

python简单使用grpc

安装工具依赖

代码语言:javascript
复制
pip install grpcio
pip install protobuf
pip install grpcio_tools    # python下的protoc编译器
  • 编写协议文件vim compute.proto
代码语言:javascript
复制
    syntax = "proto3"; //说明使用proto3语法定义协议

    package compute;
    service Compute {
        // 我们rpc服务的名字
        // 后面
        // 服务端 会用到 <ComputeServicer>
        // 客户端 会用到 <ComputeStub>
        rpc SayHello (HelloRequest) returns (HelloReply) {}
        // SayHello 调用的方法
        // HelloRequest 客户端输入的消息(对象)
        // returns 服务端
        // HelloReply 服务端 返回的消息(对象)
    }

    message HelloRequest {
        //定义 客户端输入消息内容
        string helloworld = 1;
    }

    message HelloReply {
        //定义服务端消息内容
        string result = 1;
    }
代码语言:javascript
复制
python -m grpc_tools.protoc -I ./ --python_out=./ --grpc_python_out=./ compute.proto

# python_out目录指定 xxxx_pb2.py的输出路径,我们指定为./ 当前路径
# grpc_python_out指定xxxx_pb2_grpc.py文件的输出路径,我们指定为./ 当前路径
# grpc_tools.protoc 这是我们的工具包,刚刚安装的
# -I参数指定协议文件的查找目录,我们都将它们设置为当前目录./
# compute.proto 我们的协议文件

ls
compute_pb2_grpc.py  compute_pb2.py  compute.proto
# compute.proto 协议文件
# compute_pb2.py 里面有消息序列化类
# compute_pb2_grpc.py 包含了服务器 Stub 类和客户端 Stub 类,以及待实现的服务 RPC 接口。
  • 编写服务器
代码语言:javascript
复制
import time
import grpc
from concurrent import futures

import compute_pb2,compute_pb2_grpc # 刚刚生产的两个文件

class ComputeServicer(compute_pb2_grpc.ComputeServicer):
    def SayHello(self,request,ctx):
        max_len = str(len(request.helloworld))
        return compute_pb2.HelloReply(result=max_len)
    
def main():
    # 多线程服务器
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    # 实例化 计算len的类
    servicer = ComputeServicer()
    # 注册本地服务,方法ComputeServicer只有这个是变的
    compute_pb2_grpc.add_ComputeServicer_to_server(servicer, server)
    # 监听端口
    server.add_insecure_port('127.0.0.1:19999')
    # 开始接收请求进行服务
    server.start()
    # 使用 ctrl+c 可以退出服务
    try:
        print("running...")
        time.sleep(1000)
    except KeyboardInterrupt:
        print("stopping...")
        server.stop(0)


if __name__ == '__main__':
    main()
  • 编写客户端
代码语言:javascript
复制
import grpc
import compute_pb2
import compute_pb2_grpc

_HOST = '127.0.0.1'
_PORT = '19999'


def main():
    with grpc.insecure_channel("{0}:{1}".format(_HOST, _PORT)) as channel:
        client = compute_pb2_grpc.ComputeStub(channel=channel)
        response = client.SayHello(compute_pb2.HelloRequest(helloworld="123456"))
    print("received: " + response.result)


if __name__ == '__main__':
    main()

gRPC 官方文档中文版:http://doc.oschina.net/grpc?t=56831

参考: https://blog.csdn.net/sunt2018/article/details/90176015 https://github.com/xsren/learning_record/tree/master/grpc https://www.cnblogs.com/sunshine-blog/p/12193064.html https://www.jianshu.com/p/43fdfeb105ff https://www.jianshu.com/p/14e6f5217f40

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RPC
  • gRPC
  • protobuf
  • protoc3官网
  • python-protobuf
  • python简单使用grpc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档