rpc、gRPC快速入门,python调用,protobuf协议

news2024/9/27 21:19:16

什么是rpc?grpc又是什么?

什么是RPC


远程过程调用协议RPC (Remote Procedure Call Protocol)
RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据
举例:在 a服务内,调用b服务的ticket服务中的get方法,那么在a服务里,直接调用b.ticket.get()来直接调用

客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。

什么是grpc


gRPC(Google Remote Procedure Call)是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf (Protocol Buffers)序列化协议开发,且支持众多开发语言(python,golang,javascript,C,C++、Node.js、Ruby、Objective-C、PHP和C#等)。
gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。

RESTfulgRPC
Full NameREpresentational State TransferGoogle Remote Procedure Call
PayloadReadable Data (typically JSON)Unreadable Binary Data (Protobuf)
HTTPHTTP 1.1/HTTP 2HTTP/2
PerformanceSlowerFaster
Type SafetyNoYes
Cross LanguageYesYes
Client SetupRequiredNot required
Supported FunctionsGET/PUT/DELETE/POST/...Any function

// Client端 
//    Student student = Call(ServerAddr, addAge, student)
1. 将这个调用映射为Call ID。
2. 将Call ID,student(params)序列化,以二进制形式打包
3. 把2中得到的数据包发送给ServerAddr,这需要使用网络传输层
4. 等待服务器返回结果
5. 如果服务器调用成功,那么就将结果反序列化,并赋给student,年龄更新

// Server端
1. 在本地维护一个Call ID到函数指针的映射call_id_map,可以用Map<String, Method> callIdMap
2. 等待客户端请求
3. 得到一个请求后,将其数据包反序列化,得到Call ID
4. 通过在callIdMap中查找,得到相应的函数指针
5. 将student(params)反序列化后,在本地调用addAge()函数,得到结果
6. 将student结果序列化后通过网络返回给Client

什么是protobuf


protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库(类似Json),但相比于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍
具有跨语言性:python golang java c++ javascript等等等等


生成python客户端和服务器

安装依赖

安装依赖:
pip install grpcio
pip install grpcio-tools
pip install protobuf
转化proto文件成client和server
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. wenet.proto
// 文件名 hello.proto,proto版本
syntax = "proto3";

package hello;

// 定义服务
service Greeter {
  // 发送数据
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 请求消息,包含用户的姓名。
message HelloRequest {
  string name = 1;
  string age = 2;
  string note=3;
}

// 响应消息,包含问候语。
message HelloReply {
  string message = 1;
}

在命令行输入:

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

gRPC客户端(client.py):

import grpc  # 导入gRPC库
import hello_pb2  # 导入生成的proto文件中的消息类型
import hello_pb2_grpc  # 导入生成的proto文件中的服务类型

def run():
    channel = grpc.insecure_channel('localhost:50051')  # 创建与服务器的通信通道,参数为服务器的地址和端口
    stub = hello_pb2_grpc.GreeterStub(channel)  # 创建与服务器的Stub对象,参数为通信通道
    response = stub.SayHello(hello_pb2.HelloRequest(name='John', age='25', note='Hello gRPC'))  # 调用服务器上的方法,参数为请求消息对象
    print("Response received from server: " + response.message)  # 打印服务器返回的响应消息

if __name__ == '__main__':
    run()  # 运行客户端代码

gRPC服务器(server.py):

import grpc  # 导入gRPC库
from concurrent import futures  # 导入concurrent.futures库,用于多线程处理
import hello_pb2  # 导入生成的proto文件中的消息类型
import hello_pb2_grpc  # 导入生成的proto文件中的服务类型

class GreeterServicer(hello_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):  # 实现proto文件中定义的方法,参数为请求消息对象和上下文对象
        message = 'Hello, ' + request.name + '! You are ' + request.age + ' years old.'  # 构造响应消息
        return hello_pb2.HelloReply(message=message)  # 返回响应消息对象

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))  # 创建gRPC服务器对象,参数为线程池的最大工作线程数
    hello_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server)  # 将服务实现添加到服务器中,参数为服务实现对象和服务器对象
    server.add_insecure_port('[::]:50051')  # 指定服务器监听的地址和端口,参数为地址和端口
    server.start()  # 启动服务器
    print("Server started. Listening on port 50051.")  # 打印服务器启动信息
    server.wait_for_termination()  # 等待服务器终止

if __name__ == '__main__':
    serve()  # 运行服务器代码

常用protobuf数据类型和pb文件

常用protobuf数据类型

.proto TypeNotesC++ TypeJava TypePython Type[2]Go TypeRuby Type
doubledoubledoublefloatfloat64Float
floatfloatfloatfloatfloat32Float
int32使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代int32intintint32Fixnum 或者 Bignum(根据需要)
uint32使用变长编码uint32intintuint32Fixnum 或者 Bignum(根据需要)
uint64使用变长编码uint64longintuint64Bignum
sint32使用变长编码,这些编码在负值时比int32高效的多int32intintint32Fixnum 或者 Bignum(根据需要)
sint64使用变长编码,有符号的整型值。编码时比通常的int64高效。int64longintint64Bignum
fixed32总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。uint32intintuint32Fixnum 或者 Bignum(根据需要)
fixed64总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。uint64longintuint64Bignum
sfixed32总是4个字节int32intintint32Fixnum 或者 Bignum(根据需要)
sfixed64总是8个字节int64longintint64Bignum
boolboolbooleanboolboolTrueClass/FalseClass
string一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。stringStringstr/unicodestringString (UTF-8)
bytes可能包含任意顺序的字节数据。stringByteStringstr/b''[]byte

String (ASCII-8BIT)

repeated数组(列表)RepeatedField<type>list[]typeRepeatedField
map字典Map<key_type, value_type>dict{}Map

参考资料:grpc-python02--了解rpc与grpc以及创建一个简单的grpc-python_哔哩哔哩_bilibili

gRPC(一)入门:什么是RPC? | Go 技术论坛

https://www.youtube.com/watch?v=gnchfOojMk4

python grpc框架之一 简单示例_51CTO博客_python web 框架

Python gRPC 入门 - 掘金

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

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

相关文章

何洁「桔梗」2023巡演广州站7月22日强势回归!

睽违5年&#xff0c;从心出发。7月22日&#xff0c;何洁携新专辑《桔梗》和你相约广州。这次巡回演唱会不仅会带来回忆满满的经典曲目&#xff0c;全新专辑里的作品也会惊喜开唱&#xff0c;期待值拉满。 19岁时年少成名&#xff0c;以不服输的态度诠释音乐至今&#xff0c;应该…

linux中安装nginx

2.安装nginx 2.1 安装nginx前&#xff0c;需要安装的依赖&#xff08;可能是由于nginx版本旧原因&#xff0c;可能最新或较新版本不需安装这些依赖&#xff09; 如下四个依赖需要安装到linux中 2.1.1 安装 pcre 依赖 &#xff08;使用wget命令&#xff09; 步骤一&#xff1…

自动应急灯电路/12V供电的电子节能灯电路设计

自动应急灯电路 本例介绍的自动应急灯&#xff0c;在白天或夜晚有灯光时不工作&#xff0c;当夜晚关灯后或停电时能自动点亮&#xff0c;延时一段时间后能自动熄灭。 一、电路工作原理 电路原理如图 25 所示。 该自动应急灯电路由光控灯电路、电子开关电路和延时照明电路组成…

关于时间序列的平稳性检测

时间序列的平稳性检验 对时间序列的研究和处理&#xff0c;其实也算是有点意思。很多时候就是耍流氓&#xff0c;我们假设它有规律&#xff0c;然后去研究它&#xff0c;等老天开眼的时候&#xff0c;总能找出点东西来自圆其说&#xff0c;嘿嘿。 ARIMA家族的时序模型&#xf…

Java基层云HIS系统源码融合B/S电子病历系统(SaaS模式)

一、云his系统概述 ta是一款满足二甲医院、基层医院机构业务需要的健康卫生云系统。该系统能帮助基层医院机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能&#xff0c;还能与公卫、PAC…

LPDDR4X Ball Description(引脚描述)

SymbolType&#xff08;DDR视角&#xff09;Function中文翻译CK_A CK_An CK_B CK_BnInputClock: CK and CKn are differential clock inputs. All address, command, and control input signals are sampled on the crossing of the positive edge of CK and the negative edge…

Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务六&#xff1a;训练FastText、Word2Vec词向量 任务六&#xff1a;学会训练FastText、Word2Vec词向量 说明&#xff1a;在这个任务中&#xff0c;你将学习如何训练FastText和Word2Vec词向量模型&#xff0c;这些词向量…

网络安全(黑客)自学方法

在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 我把自己整理的系统学习路线&#xff0c;拿出来跟大家分享了&#xff01;点击查看详细路线图 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xf…

Transformer详细解释

transformer的细节到底是怎么样的&#xff1f;Transformer 连环18问&#xff01; 4.1 从功能角度&#xff0c;Transformer Encoder的核心作用是提取特征&#xff0c;也有使用Transformer Decoder来提取特征。例如&#xff0c;一个人学习跳舞&#xff0c;Encoder是看别人是如何…

IDEA中springboot的热加载thymeleaf静态html页面

1.首先加入开发工具依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency> 2.其次在build maven插件中开启热部署 <bu…

第43节:cesium 大雾效果(自定义代码)(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

STM32 Proteus UCOSII系统多路数据采集系统8路开关量4路电压-0058

STM32 Proteus UCOSII系统多路数据采集系统8路开关量4路电压-0058 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统多路数据采集系统8路开关量4路电压-0058 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器8路光耦隔离开关量采集4路微小信号…

Python实现PSO粒子群优化算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

浅谈应急照明设计与应用

安科瑞 华楠 【摘要】应急照明是因正常照明的电源失效而启用的照明。应急照明作为工业及民用建筑照明设施的一个部分&#xff0c;同人身安全和建筑物、设备安全息息相关。本文对应急照明设计的主要内容进行了介绍,主要内容包括&#xff1a;应急照明的分类及含义&#xff0c;应…

如何有效地提取背景音乐并消除人声?分享这几个方法给大家!

如何有效地提取背景音乐并消除人声&#xff1f;在制作视频或音频项目时&#xff0c;我们经常需要从原始音频中提取背景音乐并消除人声。这个过程可能对初学者来说并不简单&#xff0c;因为它需要一些专门的技术和工具。为了帮助你解决这个问题&#xff0c;我们将分享三种常用的…

前端Vue入门-day02

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 指令补充 指令修饰符 v-bind 对于样式控制的增强 操作class 案例&#xff1a;京东秒杀 tab 导航高亮 …

如何将PDF转换为Excel?分享这两个实用的方法!

如何将PDF转换为Excel&#xff1f;在我们的日常工作中&#xff0c;我们可能会遇到一些别人发送的PDF文件。这些PDF文件可能包含一些需要我们提取出来做报告的表格或数据信息。如果一个个数据敲入实在是太麻烦了&#xff0c;也很耽误时间&#xff0c;毕竟工作的效率是最重要的。…

云计算的学习(一)

一、云计算的介绍 1.初识云计算及云计算的优势 1.1常见的云计算服务 云文件存储、云音乐、云备份等。 1.2云计算的优势 ①按需自助服务 IT行业需求与客服咨询&#xff0c;了解与自己相适应的云计算服务。 ②广泛的网络接入 只要连接互联网即可使用云计算服务。 ③资源…

一个知识点:delete QProcess的parent时, 启动的子进程会不会销毁?

如题&#xff1a; 好久没有用QProcess了, 一直在搞 wasm 原生c 突然被问到这个 我一想 应该会被销毁 因为下面代码执行的时候 执行delete p 就好杀死进程 QProcess *p new QProcess();p->start("D://FreeClipViewer//FreeClipViewer.exe");delete p;那delete…

总结TLS指纹反爬

前言 在我们参数算法完全还原的情况&#xff0c;请求网站却提示身份认证失败&#xff0c;我们推测可能存在的情况如下&#xff1a; cookieshttp2.0tls指纹 其中什么是tls指纹&#xff1f; TLS指纹&#xff0c;也有人叫JA3指纹。在创建TLS连接时&#xff0c;根据TLS协议在Cl…