全栈工程师开发手册 (作者:栾鹏)
架构系列文章

gRPC 简介:

gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。

安装:

gRPC 的安装:

$ pip install grpcio

安装 ProtoBuf 相关的 python 依赖库:

$ pip install protobuf

安装 python grpc 的 protobuf 编译工具:

$ pip install grpcio-tools

GRPC使用案例

下看一下项目目录结构

grpc是一套传输协议,我们需要在底层实现这套传输协议.当然这些工作都已经被做完了,所以我们只要学会使用一个具有grpc传输协议的服务器和在客户端上调用grpc传输协议传输数据就可以了.

grpc传输协议传输的数据类型为protobuf数据.所以grpc都是和protobuf一块使用.

(1)新建data.proto文件,定义传输的数据格式和grpc服务要实现的函数

syntax = "proto3";
package example;service FormatData {   //定义服务,用在rpc传输中rpc DoFormat(actionrequest) returns (actionresponse){}
}
message actionrequest {string text = 1;
}
message actionresponse{string text=1;
}

(2)生成proto数据的python调用格式和grpc服务接口

在proto文件目录下 调用下列命令

$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./data.proto

会生成:data_pb2.py 与 data_pb2_grpc.py, 其中data_pb2.py是数据格式调用的文件,data_pb2_grpc.py是grpc传输协议接口调用的文件.

(3)创建实现了grpc传输协议的服务器端

在服务器端代码中需要实现proto文件中编写的服务接口,并重写处理函数,将重写后的服务类实例化以后添加到grpc服务器中,这样创建的grpc服务器就可以实现自定义的proto传输服务了.

# 实现了 server 端用于接收客户端发送的数据,并对数据进行大写处理后返回给客户端# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
import time
from concurrent import futures
from example import data_pb2, data_pb2_grpc_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '8080'# 实现一个派生类,重写rpc中的接口函数.自动生成的grpc文件中比proto中的服务名称多了一个Servicer
class FormatData(data_pb2_grpc.FormatDataServicer):# 重写接口函数.输入和输出都是proto中定义的Data类型def DoFormat(self, request, context):str = request.textreturn data_pb2.actionresponse(text=str.upper())  # 返回一个类实例def serve():# 定义服务器并设置最大连接数,corcurrent.futures是一个并发库,类似于线程池的概念grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))   # 创建一个服务器data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer)  # 在服务器中添加派生的接口服务(自己实现了处理函数)grpcServer.add_insecure_port(_HOST + ':' + _PORT)    # 添加监听端口grpcServer.start()    #  启动服务器try:while True:time.sleep(_ONE_DAY_IN_SECONDS)except KeyboardInterrupt:grpcServer.stop(0) # 关闭服务器if __name__ == '__main__':serve()

(4)创建实现能识别proto数据类和实现grpc传输协议.

# 实现了客户端用于发送数据并打印接收到 server 端处理后的数据# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
from example import data_pb2, data_pb2_grpc_HOST = 'localhost'
_PORT = '8080'def run():conn = grpc.insecure_channel(_HOST + ':' + _PORT)  # 监听频道print(conn)client = data_pb2_grpc.FormatDataStub(channel=conn)   # 客户端使用Stub类发送请求,参数为频道,为了绑定链接print(client)response = client.DoFormat(data_pb2.actionrequest(text='hello,world!'))   # 返回的结果就是proto中定义的类print("received: " + response.text)if __name__ == '__main__':run()

客户端链接的主机号和端口号,必须是服务器创建的主机号和端口号.

gRPC传输协议使用(python教程)相关推荐

  1. python菜鸟教程字典-python教程菜鸟教程学习路线

    python教程菜鸟教程学习路线,需要学Python 环境搭建.Python 中文编码.Python 基础语法.Python 变量类型.Python 运算符.Python 条件语句.Python 循环 ...

  2. python教程菜鸟教程学习路线

    python教程菜鸟教程学习路线,需要学Python 环境搭建.Python 中文编码.Python 基础语法.Python 变量类型.Python 运算符.Python 条件语句.Python 循环 ...

  3. python群发邮箱软件下载_利用STMP邮件传输协议,实现python群发邮箱脚本!

    (私信小编007即可自动获取大量Python学习资料) 假设你这学期担任某课程的学生助理,老师想布置课程的作业并与下一节课提交,你将作业要求发到了班级群里面,但是很多同学可能没有及时查看群消息,为了稳 ...

  4. grpc调用_使用gRPC和协议缓冲区实现远程过程调用

    grpc调用 RPC简介 ( Introduction To RPC ) Remote procedure call (RPC) architecture is popular in building ...

  5. 廖雪峰老师Python教程读后笔记

    廖老师网站:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 花几天时间看了廖老师的 ...

  6. smtplib python教程_Python smtplib 教程

    Python smtplib 教程展示了如何使用 smtplib 模块在 Python 中发送电子邮件. 要发送电子邮件,我们使用 Python 开发服务器,Mailtrap 在线服务和共享的网络托管 ...

  7. 廖的python教程_廖雪峰的Python3.x教程.pdf

    目录 Python教程 Python简介 安装Python Python解释器 第一个Python程序 使用文本编辑器 Python代码运行助手 输入和输出 源码 learning.py Python ...

  8. python教程书籍-大牛推荐的10本学习 Python 的好书

    Python:蛇亚目蟒科,主要包括分布于非洲及亚洲的无毒蟒蛇. Python:Richard Clabaugh拍摄的恐怖电影,2000年发行. Python:澳大利亚汽车公司. Python:英国偶发 ...

  9. 零基础自学python教程-零基础5个月快速学会Python的秘诀

    点击蓝字"python教程"关注我们哟! 零基础该怎么快速学习Python呢?如何用5个月快速学会Python? 1 这里主要讲一下python基础与爬虫 个人认为可以分为两步走: ...

最新文章

  1. 万字总结,体系化带你全面认识 Nginx
  2. 最大连续子序列乘积(DP)
  3. Python金融大数据分析——第四章数据类型和结构
  4. Linux 在一个命令行上执行多个命令
  5. 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties
  6. [数据结构] 二叉树基础
  7. 题解-BOI 2004 Sequence
  8. 中国人工智能学会通讯——基于视频的行为识别技术 1.1 什么是行为
  9. 哈哈,这个小游戏很有意思!
  10. Class.forName()用法详解
  11. d3.js 搭建 d3-force-directed-graph 例子
  12. Socket IO多路复用: epoll原理图解
  13. matlab|已知多点坐标,求两两之间的距离
  14. html双人可悔棋五子棋源码,MATLAB实现五子棋游戏(双人对战、可悔棋).pdf
  15. 【音乐】基于matlab演奏《天空之城》【含Matlab源码 1874期】
  16. proteus里面没有stm32怎么办_STM32难不难,如何学习?这几点老司机建议,你得好好收藏!...
  17. 把一个把正整数分解为素数乘积
  18. 计算机信息的一般处理过程,信息一般处理过程包括什么?
  19. 苹果手机录音怎么转换成mp3
  20. 洛谷 T284709 怨念(resent)

热门文章

  1. python 下载文件-python下载文件的三种方法
  2. 语音识别揭秘:你的手机究竟有多理解你?
  3. 顶尖的语音识别软件――Nuance Recognizer_语音识别_CTI论坛
  4. 数据库原理mysql_数据库原理:MySql的安装
  5. jQuery-元素节点操作
  6. 笔记本重新启动计算机,为什么笔记本电脑突然重新启动_计算机的基本知识_IT /计算机_信息...
  7. FFmpeg源代码简单分析:avcodec_close()
  8. mysql批量写入redis_如何高效地向Redis插入大量的数据(推荐)
  9. Kubernetes 配置私有镜像仓库时,没有权限访问的问题
  10. window下Oracle 11G安装文档