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

这篇具有很好参考价值的文章主要介绍了rpc、gRPC快速入门,python调用,protobuf协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是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使用、和电池寿命。

RESTful gRPC
Full Name REpresentational State Transfer Google Remote Procedure Call
Payload Readable Data (typically JSON) Unreadable Binary Data (Protobuf)
HTTP HTTP 1.1/HTTP 2 HTTP/2
Performance Slower Faster
Type Safety No Yes
Cross Language Yes Yes
Client Setup Required Not required
Supported Functions GET/PUT/DELETE/POST/... Any function

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

// 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

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

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 Type Notes C++ Type Java Type Python Type[2] Go Type Ruby Type
double double double float float64 Float
float float float float float32 Float
int32 使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代 int32 int int int32 Fixnum 或者 Bignum(根据需要)
uint32 使用变长编码 uint32 int int uint32 Fixnum 或者 Bignum(根据需要)
uint64 使用变长编码 uint64 long int uint64 Bignum
sint32 使用变长编码,这些编码在负值时比int32高效的多 int32 int int int32 Fixnum 或者 Bignum(根据需要)
sint64 使用变长编码,有符号的整型值。编码时比通常的int64高效。 int64 long int int64 Bignum
fixed32 总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。 uint32 int int uint32 Fixnum 或者 Bignum(根据需要)
fixed64 总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。 uint64 long int uint64 Bignum
sfixed32 总是4个字节 int32 int int int32 Fixnum 或者 Bignum(根据需要)
sfixed64 总是8个字节 int64 long int int64 Bignum
bool bool boolean bool bool TrueClass/FalseClass
string 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。 string String str/unicode string String (UTF-8)
bytes 可能包含任意顺序的字节数据。 string ByteString str/b'' []byte

String (ASCII-8BIT)

repeated 数组(列表) RepeatedField<type> list []type RepeatedField
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 入门 - 掘金文章来源地址https://www.toymoban.com/news/detail-545110.html

到了这里,关于rpc、gRPC快速入门,python调用,protobuf协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【RPC 协议】序列化与反序列化 | lua-cjson | lua-protobuf

    在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关

    2024年02月10日
    浏览(39)
  • RPC分布式网络通信框架(一)—— protobuf的使用

    常见序列化和反序列化协议有XML、JSON、protobuf,相比于其他protobuf更有优势: 1、protobuf是二进制存储的,xml和json都是文本存储的。故protobuf占用带宽较低 2、protobuf不需要存储额外的信息。 json如何存储数据?键值对。例:Name:”zhang san”, pwd: “12345”。 protobuf存储数据的方式

    2024年02月16日
    浏览(54)
  • 安卓协议逆向 咸鱼 frida rpc 调用方案

    通过frida rpc调用真机获取指定的搜索结果数据。 本文仅供大家学习及研究使用、切勿用于各种非法用途。 frida 提供了一种跨平台的 rpc (远程过程调用)机制,通过 frida rpc 可以在主机和目标设备之间进行通信,并在目标设备上执行代码,可实现功能如下: 1、动态地

    2024年02月07日
    浏览(41)
  • 基于protobuf构建grpc服务

    protobuf是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为profobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。 优势: 序列化后体积相比Json和XML很小,适合网络传输 支持跨平台多

    2024年02月02日
    浏览(48)
  • catface,使用Interface定义Controller,实现基于Http协议的RPC调用

    : Interface定义Controller;feign服务端;feign interface;Http RPC;cat-client;cat-server;catface; 概   要: catface ,使用类似 FeignClient 的Interface作为客户端发起Http请求,然后在服务端使用实现了这些Interface的类作为 Controller 角色,将客户端、服务端通过Interface耦合在一起,实

    2024年02月09日
    浏览(48)
  • 【大唐杯学习超快速入门】5G技术原理仿真教学——5G网络协议架构

    这一部分主要考察了从ue到gnb的DU与CU再到核心网,从用户面到控制面,各部分的接口,以及协议栈。首先要记住各个协议的内涵,使用在哪里,然后要记住协议栈。在做题的时候对应位置同一层的协议必定是相同的。 学习参考如下链接 5G架构和协议栈 5GNR协议栈 5G空口协议栈

    2024年02月11日
    浏览(51)
  • [golang 微服务] 4. gRPC介绍,Protobuf结合gRPC 创建微服务

    gRPC是一个 高性能 、 开源 和 通用 的 RPC 框架 , 面向移动端 和 HTTP/2 设计,目前提供 C、Java 和 Go语言版本,分别是:grpc, grpc-java, grpc-go, 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持 (1).提供几乎所有主流语言的实现, 打破语言隔阂 (2). 基于 HTTP/2 标准设计

    2024年02月04日
    浏览(45)
  • 【RPC】—Protobuf编码原理

    ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ Spring专栏👉https://blog.csdn.net/weixin_53580595/category_12279588.html SpringMVC专栏👉https://blog.csdn.net/weixin_53580595/category_12281721.html Mybatis专栏👉https://blog.csdn.net/weixin_53580595/catego

    2024年02月13日
    浏览(48)
  • golang gRPC:根据.protobuf文件生成go代码

    安装 protoc 编译器。如果没有安装,可以参考官方文档进行安装。 使用 protoc 命令生成 gRPC 代码: 此命令将生成 .pb.go 和 _grpc.pb.go 文件,其中包含 protobuf 和 gRPC 的代码实现. –go_out选项会生成纯粹的Protocol Buffer消息代码,这包括Go语言的消息结构体和一些辅助方法。如果你只

    2024年02月14日
    浏览(43)
  • 在protobuf里定义描述rpc方法的类型

    service  UserServiceRpc     //在test.proto中定义 {     rpc Login(LoginRequest)returns(LoginResponse);     rpc GetFriendLists(GetFriendListRequest)returns(GetFriendListResponse); }   test.proto文件生成test.pb.cc      protoc  test.proto  --cpp_out=./    将生成的文件放到 ./ 目录下,截取一部分如下 调用关系如图所示

    2024年04月25日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包