Python3 集成 gRPC 服务

Python3 集成 gRPC 服务及 protocol buffers

    • 1、gRPC是什么?
      • 1.1、gRPC大致请求流程
      • 1.2、gRPC特性
      • 1.3、gRPC优势和劣势
        • 1.3.1、优势
        • 1.3.2、劣势
    • 2、构建一个python3的gRPC服务
      • 2.1、虚拟环境搭建(可选择自动安装pip)
      • 2.1、引入相关依赖
      • 2.2、创建项目
        • 2.2.1、项目整体结构
      • 2.3、编写proto
      • 2.4、将example.proto文件编译成python文件
      • 2.5、 执行后将在~/grpc_example/proto文件下新增3个文件
      • 2.6、 编写服务端
      • 2.7、编写客户端
      • 2.8、启动服务端
      • 2.9、启动客户端
    • 3、运行效果展示
      • 3.1、服务端效果
      • 3.2、客户端效果
    • 4、gRPC官网地址

1、gRPC是什么?

  • 在说gRPC之前,我们先说REST通信。当前在设计软件产品的时候,开发人员可能接触的更多的是基于REST的通信。REST通信是非常灵活的一种方式,将资源发布在网络,由客户端通过http或者http2协议与资源进行交互,现在的微服务基本上都是运用这种技术框架。而RPC是和REST不同的一种通信架构。

  • RPC 最终的效果是让开发人员的可以像调用本地方法一样调用远程服务提供的方法。gRPC是RPC的一种,目前许多公司按照自己的需求和需要设计了自己的RPC通信架构,gRPC就是由谷歌研发的一个RPC通信框架。g代表global全球化的意思。它是一种高性能、支持多种开发语言的通信架构。

1.1、gRPC大致请求流程

1、客户端(gRPC client)调用方法,发起RPC调用

2、对请求信息使用 Protobuf 进行对象序列化。

3、服务端(gRPC Server)接收到请求后,反序列化请求信息,进行业务逻辑处理并返回。

4、对响应结果使用 Protobuf 进行对象序列化。

5、客户端接受到服务端响应,反序列化返回的信息。回调被调用的 A 方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果。
gRPC请求流程

1.2、gRPC特性

  • grpc可以跨语言使用。支持多种语言 支持C++、Java、Go、Python、Ruby、C#、Node.js、Android Java、Objective-C、PHP等编程语言

  • 基于 IDL ( 接口定义语言(Interface Define Language))文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端Stub;

  • 通信协议基于标准的 HTTP/2 设计,支持·双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;

  • 序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。

  • 安装简单,扩展方便(用该框架每秒可达到百万个RPC)

1.3、gRPC优势和劣势

1.3.1、优势
  • Protobuf序列化和反序列化的速度,是JSON的5倍。
  • gRPC是为HTTP/2而设计的,它是HTTP的一个主要版本,与HTTP 1.x相比具有显著的性能优势:二进制框架和压缩。HTTP/2协议在发送和接收方面都很紧凑和高效。通过单个TCP连接复用多个HTTP/2调用。多路复用消除了线头阻塞。
1.3.2、劣势
  • 浏览器支持有限,

  • 当下,不可能直接从浏览器调用gRPC服务。gRPC大量使用HTTP/2功能,没有浏览器提供支持gRPC客户机的Web请求所需的控制级别。gRPC Web并非支持所有gRPC功能。不支持客户端和双向流,并且对服务器流的支持有限。

  • 不是人类可读的

  • HTTP API请求以文本形式发送,可以由人读取和创建。

  • 但它的二进制格式是不可读的。

2、构建一个python3的gRPC服务

步骤:

  1. 引入相关依赖
  2. 编写protobuf
  3. 将protobuf转成python代码
  4. 开发gRPC服务

2.1、虚拟环境搭建(可选择自动安装pip)

  • 创建虚拟环境
- 自动安装pip执行命令:
python3 -m venv myenv- 手动pip执行命令:
python3 -m venv --without-pip myenv
  • 启动虚拟环境
source /xxx/xxx/myenv/bin/activate
  • 手动安装pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python3 get-pip.py

2.1、引入相关依赖

通过pip3安装对应的包

pip3 install grpcio-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 install grpcio -i https://pypi.tuna.tsinghua.edu.cn/simple/

2.2、创建项目

mkdir -P ~/grpc_example/{proto,client,server}
2.2.1、项目整体结构

项目整体结构

2.3、编写proto

vim ~/grpc_example/proto/example.proto

syntax = "proto3";package your_package_name;message YourRequest {string name = 1;
}message YourResponse {string message = 1;
}service YourService {rpc YourRPCMethod (YourRequest) returns (YourResponse);
}

2.4、将example.proto文件编译成python文件

python3 -m  grpc_tools.protoc -I ./proto --python_out=./proto --pyi_out=./proto --grpc_python_out=./proto proto/example.proto

2.5、 执行后将在~/grpc_example/proto文件下新增3个文件

example_pb2.py
example_pb2_grpc.py
example_pb2.pyi

2.6、 编写服务端

vim ~/grpc_example/client/client.py

# -*- coding:utf-8 -*-
import sys
import pathlibabspathfile = pathlib.Path(__file__)
package_path = abspathfile.absolute().parent.parent.parent
sys.path.append(str(package_path))import grpc
from concurrent import futures
from example.proto import example_pb2
from example.proto import example_pb2_grpcclass YourService(example_pb2_grpc.YourServiceServicer):def YourRPCMethod(self, request, context):name = request.name# 实现自己的RPC方法逻辑response = example_pb2.YourResponse()response.message = "Hello, " + nameprint("response", response)return responsedef serve():server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))example_pb2_grpc.add_YourServiceServicer_to_server(YourService(), server)server.add_insecure_port("[::]:50051")print("开启服务")server.start()server.wait_for_termination()if __name__ == '__main__':serve()

2.7、编写客户端

vim ~/grpc_example/server/server.py

# -*- coding:utf-8 -*-
import sys
import pathlibabspathfile = pathlib.Path(__file__)
package_path = abspathfile.absolute().parent.parent.parent
sys.path.append(str(package_path))import grpc
from example.proto import example_pb2
from example.proto import example_pb2_grpcdef run():channel = grpc.insecure_channel("localhost:50051")stub = example_pb2_grpc.YourServiceStub(channel)request = example_pb2.YourRequest()request.name = "zsc"# 设置请求参数response = stub.YourRPCMethod(request)print("response", response)if __name__ == '__main__':run()

2.8、启动服务端

python3 ~/grpc_example/server/server.py

2.9、启动客户端

python3 ~/grpc_example/client/client.py

3、运行效果展示

3.1、服务端效果

服务端

3.2、客户端效果

客户端

4、gRPC官网地址

  • gRpc官网地址:https://www.grpc.io

  • gRpc中文文档地址:http://doc.oschina.net/grpc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集团数字化转型方(五)

集团数字化转型方案通过全面整合人工智能(AI)、大数据分析、云计算和物联网(IoT)等前沿技术,构建了一个高度智能化的业务平台,从而实现业务流程的自动化、数据驱动的决策支持、精准的市场预测、以及个性化的…

快速带你玩转高性能web服务器后续

目录 一、Nginx 高级配置 1.1 Nginx 状态页 1.2 Nginx 压缩功能 1.3 Nginx的版本隐藏 1.4 Nginx 变量使用 1.4.1 内置变量 二、 Nginx Rewrite 相关功能 2.1 ngx_http_rewrite_module 模块指令 2.1.1 if 指令 2.1.2 set 指令 2.1.3 break 指令 2.1.4 return 指令 2…

【卡码网C++基础课 1.A+B问题1】

文章目录 题目描述与分析一、C函数基础二、输入输出流三、变量四、写入数据五、输出数据六、尝试第一次提交七、循环输入输出八、延伸 题目描述与分析 题目描述: 你的任务是计算ab。 输入描述: 输入包含一系列的a和b对,通过空格隔开。一对a…

【UE5】基于摄像机距离逐渐剔除角色

效果 步骤 1. 新建一个工程,在内容浏览器中添加第三人称游戏内容包 2. 找到第三人称角色的材质实例“MI_Quinn_01”并打开 找到材质实例的父项材质“M_Mannequin” 打开材质“M_Mannequin” 在材质图表中添加如下节点 此时运行效果如文章开头所示。 参考视频&#…

【vue教程】七. Vue 的动画和过渡

文章目录 往期列表回顾本章涵盖知识点Vue 的内置动画系统基本的进入和离开过渡列表过渡 CSS 过渡CSS 过渡基础Vue 中的 CSS 过渡 JavaScript 动画使用 JavaScript 钩子 第三方动画库的使用集成 Animate.css 实例演示创建一个简单的动画应用 结语 往期列表 【vue教程】一. 环境…

RabbitMQ如何保证消息不丢失

RabbitMQ消息丢失的三种情况 第一种:生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 第二种:RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了。 第三种…

Java基础——注释

在开发中注释是必不可少的,帮助我们更好的标记阅读代码,下面介绍几种常用的注释方式。 一、注释种类 1. 单行注释 使用//一行代码来进行注释,只能注释一行内容 2. 多行注释 使用斜杠星号的方式 /*注释多行代码*/,注释多行代…

2024最新急速暴走小米运动自动刷步卡密版PHP源码

2023最新发布的急速暴走小米运动自动刷步卡密版PHP源码。该源码使用PHPTP6layui-Mini开发,旨在实现小米运动自动刷步功能。该程序支持通过微信修改步数,并采用卡密认证方式,用户只需提交提供的卡密,即可每日自助修改步数。 需要注…

Linux虚拟机磁盘管理-添加磁盘

添加磁盘--添加前请选关闭虚拟机 添加步骤: 1.编辑虚拟机设置 2.选择硬盘 3.选择SCSI 4.创建新虚拟磁盘 5.设置磁盘大小 6.点击完成 开机的时候会去读取有几块硬盘,总共我们是有4块硬盘,sda\sdb\sdc\sdd 注意:新加的硬盘实际我们…

鸿萌数据恢复服务:SQL Server 中的“PFS 可用空间信息不正确”错误

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份、网络及终端数据安全等解决方案与服务。 同时,鸿萌是国际主流数据恢复软件(Stellar、UFS、R-Studio、ReclaiMe Pro 等)的授权代理商,为专…

爬虫案例3——爬取彩票双色球数据

简介:个人学习分享,如有错误,欢迎批评指正 任务:从500彩票网中爬取双色球数据 目标网页地址:https://datachart.500.com/ssq/ 一、思路和过程 目标网页具体内容如下: ​​​​​ 我们的任务是将上图中…

使用AWS Lambda轻松开启Amazon Rekognition之旅

这是本系列文章的第一篇,旨在通过动手实践,帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章,大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧! 介绍 什么是Amazon Rekognition&…

前端宝典之五:React源码解析之深度剖析Diff算法

本文主要针对React源码进行解析,内容有: 1、Diff算法原理、两次遍历 2、Diff瓶颈及限制 3、Diff更新之单节点和多节点原理 一、Diff源码解析 以下是关于 React Diff 算法的详细解析及实例: 1、React Diff 算法的基本概念和重要性 1.1 概念…

【LeetCode每日一题】——301.删除无效的括号

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 广度优先搜索 二【题目难度】 困难 三【题目编号】 301.删除无效的括号 四【题目描述】 给…

【C++】————智能指针

作者主页: 作者主页 本篇博客专栏:C 创作时间 :2024年8月20日 一,什么是智能指针 在C中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&…

Spring模块详解Ⅱ

目录 Spring Beans模块详解1. 什么是 Bean?2. Spring Bean的配置方式2.1 基于 XML 配置例子: 2.2 基于注解配置例子: 2.3 基于 Java 配置(JavaConfig)例子: 3. Bean 的生命周期生命周期回调的例子: 4. Bea…

Oracle+ASM+High冗余详解及空间计算

Oracle ASM(Automatic Storage Management)的High冗余模式是一种提供高度数据保护的策略,它通过创建多个数据副本来确保数据的可用性和安全性。 以下是关于Oracle ASM High冗余的详细解释: 一、High冗余的特点 1.数据冗余度 在Hi…

极速闪存启动:SD与SPI模式的智能初始化指南

最近很多客户朋友在询问我们 CS 创世 SD NAND 能不能使用 SPI 接口,两者使用起来有何区别,下面为大家详细解答。 SD MODE: CS 创世 SD NAND 支持 SD 模式和 SPI 模式,SD NAND 默认为 SD 模式,上电后,其初始化过程如下…

【Word多级标题完整设置】设置各级标题样式将多级列表链接到各级标题样式中

Word多级标题完整设置 一、设置各级标题样式主标题样式设置中英文字体、字形以及字号设置段落设置(缩进、间距和行距) 一级标题样式设置中英文字体、字形以及字号设置段落设置(缩进、间距和行距) 二级标题样式设置中英文字体、字形…

深度学习基础—Batch Norm

对于一个神经网络我们知道,归一化输入特征是加速网络训练的技巧之一,因为归一化后,损失函数的图像就会由狭长变得更圆,那么这是否启发我们,在深度更深模型中,对各层的输出进行归一化,有益于下一…