RPC在Python中的使用及原理浅析

这篇具有很好参考价值的文章主要介绍了RPC在Python中的使用及原理浅析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RPC是远程过程调用(Remote Procedure Call)的缩写形式。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。

gRPC 是Google开源的一款高性能 RPC 框架,基于 ProtoBuf 序列化协议进行开发,支持多种语言。下面介绍Python语言的gRPC通信示例。

1 python3使用gRPC示例

使用案例:小写字符串转换为大写字符串。目录结构如下:

RPC在Python中的使用及原理浅析

1.1 安装 Python 依赖包

pip install protobuf
pip install grpcio
pip install grpcio-tools

1.2 新建 data.proto文件

data.proto 为protobuf格式文件,定义了数据类以及远程调用方法。

syntax = "proto3";
package base_package;


service FormatData {   //定义服务,用在rpc传输中
  rpc DoFormat(actionrequest) returns (actionresponse){}
}

message actionrequest {
  string text = 1;
}

message actionresponse{
  string text=1;
}

1.3 生成proto数据的python调用格式、gRPC方法接口

Linux平台中运行:

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

在 base_package 文件夹下生成 data_pb2.py 和 data_pb2_grpc.py,其中 data_pb2.py 为数据格式文件,data_pb2_grpc.py 为gRPC方法文件。

1.4 gRPC服务端

服务端具体实现了proto文件中定义的方法 DoFormat,将实现后的服务类添加到gRPC服务端中,当服务端接收到客户端要调用的函数名时通过反射机制执行具体的方法并返回执行结果。

import grpc
import time
from concurrent import futures
from base_package import data_pb2, data_pb2_grpc

_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '8080'


class FormatData(data_pb2_grpc.FormatDataServicer):
    # 重写接口函数
    def DoFormat(self, request, context):
        str = request.text
        return data_pb2.actionresponse(text=str.upper())  # 返回一个类实例


def server():
    # 定义服务器并设置最大连接数,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__':
    server()

1.5 gRPC客户端

客户端连接gRPC服务端后,即可进行远程过程调用。

import grpc
from base_package import data_pb2, data_pb2_grpc

_HOST = 'localhost'
_PORT = '8080'


def run():
    conn = grpc.insecure_channel(_HOST + ':' + _PORT)  # 监听频道
    client = data_pb2_grpc.FormatDataStub(channel=conn)  # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
    response = client.DoFormat(data_pb2.actionrequest(text='hello,world!'))  # 返回的结果就是proto中定义的类
    print("received: " + response.text)


if __name__ == '__main__':
    run()

输出结果:

received: HELLO,WORLD!

2 RPC基本原理浅析

2.1 RPC架构

一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。

  • 客户端(Client),服务的调用方。
  • 客户端存根(Client Stub),负责RPC调用的请求编码和响应结果解码,即把调用涉及到的方法、调用参数等按照Client端和Server端约定的协议编码发送到Server端,接收Server的响应并对响应进行解码从而得到最终的RPC调用结果。
  • 服务端(Server),真正的服务提供者。
  • 服务端存根(Server Stub),接受Client端发送的调用请求,并按照Client端和Server端约定的远程调用协议对请求进行解码,根据解码后的请求定位到Server端被调用的目标代码,调用处理完之后对返回结果进行编码发送到Client端。

2.2 RPC流程

RPC在Python中的使用及原理浅析

(1) 客户端(client)以本地调用方式(即以接口的方式)调用服务;

(2) 客户端存根(client stub)接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体(将消息体对象序列化为二进制);

(3) 客户端通过sockets将消息发送到服务端;

(4) 服务端存根( server stub)收到消息后进行解码(将消息对象反序列化);

(5) 服务端存根( server stub)根据解码结果调用本地的服务;

(6) 本地服务执行并将结果返回给服务端存根( server stub);

(7) 服务端存根( server stub)将返回结果打包成消息(将结果消息对象序列化);

(8) 服务端(server)通过sockets将消息发送到客户端;

(9) 客户端存根(client stub)接收到结果消息,并进行解码(将结果消息反序列化);

(10) 客户端(client)得到最终结果。

RPC的目标是要把2、3、4、7、8、9这些步骤都封装起来。

2.3 RPC作用及优势

作用

  • 1、使服务解耦
  • 2、分布式设计
  • 3、部署灵活
  • 4、容易扩展

优势
1、一般使用长链接,不必每次通信都要3次握手,减少网络开销
2、一般都有注册中心,有丰富的监控管理
3、发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作
4、协议私密,安全性较高
5、rpc 能做到协议更简单内容更小,效率更高
6、rpc 是面向服务的更高级的抽象,支持服务注册发现,负载均衡,超时重试,熔断降级等高级特性。

3 RPC 和 HTTP 的区别及适用场景

3.1 RPC 和 HTTP 区别

1、传输协议:
  RPC:可以基于HTTP协议,也可以基于TCP协议
  HTTP:基于HTTP协议
从网络协议来说,Http协议与Rpc同属于应用层, 他们的底层都是tcp协议。RPC和HTTP他们最本质的区别,就是RPC主要工作在TCP协议之上,而HTTP服务主要是工作在HTTP协议之上,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹。

2、传输效率:
  RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减小报文体积,提高传输效率
  HTTP:如果是基于http1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装下可以作为一个RPC来使用,这时标准的RPC框架更多的是服务治理。
http协议其实是属于面向桌面浏览器的一个通信协议,对于缓存,幂等或者Cookies相关的方面做了很多的事情。但是对于服务器之间直接的交互,Rpc就能够体现出来他的优势了。自定义协议,减少数据传输:我们大概看一下http协议。请求行,请求头部,请求数据,空行。很明显对于远程调用场景,我们对于请求行的依赖不是特别的强,那么这一部分在我们应用场景下,将会成为负担,但是http协议又是固定的,我们也不可能随便修改协议的格式。所以,通过rpc协议我们可以精简请求的数据,来尽可能少的传输我们的数据。当前,rpc也可以通过http协议来进行传输。

3、性能消耗:
  RPC:可以基于protobuf实现高效的二进制传输
  HTTP:大部分是基于json实现的,字节大小和序列化耗时都比protobuf要更消耗性能。

4、负载均衡:
  RPC:基本自带了负载均衡策略
  HTTP:需要配置Nginx、HAProxy配置

5、服务治理:(下游服务新增,重启,下线时如何不影响上游调用者)
  RPC:能做到自动通知,不影响上游
  HTTP:需要事先通知,如修改NGINX配置。

6、连接:
  RPC:长连接
  HTTP:短连接

rpc使用长连接:直接基于socket进行连接,不用每个请求都重新走三次握手的流程。

3.2 使用场景

RPC服务一般用于集群内部微服务之间的通信,如果需要对外暴露服务一般会提供等价的HTTP REST接口。
RPC在Python中的使用及原理浅析

参考

Python语言实现gRPC通信 (在Linux环境下生成proto文件!在windows下面执行错误了)
RPC原理解析

Python——gRPC详解及实战避坑方案(上)
什么是RPC
http与rpc对比文章来源地址https://www.toymoban.com/news/detail-448171.html

到了这里,关于RPC在Python中的使用及原理浅析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • RPC核心原理(整体架构/调用过程)

    Server: Provider ,暴露服务,服务提供方 Client: Consumer ,服务消费,调用远程服务 Registry:服务注册与发现 RPC的调用过程如下: 第一步:server会将他需要暴露的服务以及他的地址信息注册到Registry这一注册中心。 第二步:client通过注册中心一只关注它所需要的服务在哪里,如果此时

    2024年02月09日
    浏览(46)
  • rpc通信原理浅析

    rpc(remote procedure call),即远程过程调用,广泛用于分布式或是异构环境下的通信,数据格式一般采取protobuf。 protobuf(protocol buffer)是google 的一种数据交换的格式,它独立于平台语言。 google 提供了protobuf多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言

    2024年02月15日
    浏览(33)
  • 【Windows】RPC调用过程实例详解

    概述:windows 创建 RPC调用过程实例详解 参考文章:Remote procedure call (RPC)(远程过程调用 (RPC)) - Win32 apps | Microsoft Learn 定义接口的第一步是使用 uuidgen 实用工具生成通用唯一标识符(UUID)。UUID使客户端和服务端能够相互识别。该工具包含在阿庄平台软件开发工具包中(SDK)

    2024年02月07日
    浏览(41)
  • RPC远程调用

    PRC是一种调用方式而不是一种协议 在本地调用方式时由于方法在同一个内存空间,所以程序中可以直接调用该方法,但是浏览器端和服务端程序是不在一个内存空间的,需要使用网络来访问,就需要使用TCP或者UDP协议,由于TPC协议是面向连接,基于字节流的,使用起来不太方

    2024年02月11日
    浏览(39)
  • [RPC]:Feign远程调用

    摘要:RestTemplate;Feign;远程调用; Feign是一个简化HTTP客户端编写的框架,通过声明式方式将远程服务调用封装成简单接口调用。 1.2.1 使用RestTemplate发送远程调用代码 要求:系统调用者在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。 1.2.1.1 项目示例

    2024年02月10日
    浏览(45)
  • 【Java框架】RPC远程调用

    RPC(Remote Procedure Call)叫作远程过程调用,它是利用网络从远程计算机上请求服务,可以理解为把程序的一部分放在其他远程计算机上执行。通过网络通信将调用请求发送至远程计算机后,利用远程计算机的系统资源执行这部分程序,最终返回远程计算机上的执行结果。 RP

    2024年02月15日
    浏览(39)
  • 基于netty的rpc远程调用

    🚀🚀🚀这是一个手写RPC项目,用于实现远程过程调用(RPC)通信🚀🚀🚀 欢迎star串门 : https://github.com/red-velet/ 🚀Q-PRC 简单的RPC框架的实现 :该RPC框架实现了基本的远程过程调用功能,允许客户端通过网络调用远程服务的方法,实现分布式系统之间的通信和协作。 基于

    2024年02月14日
    浏览(36)
  • RPC远程调用加密方法获取返回值

    从混淆的加密JS中还原了加密参数的具体生成流程,结果想从JS转python的过程中第一步就卡住了。开头密钥JS代码如下,但是水平有限不知道如何转为python实现(如果有大佬知道希望可以评论指点)。利用execjs+jsdom来执行简化还原后的JS代码依旧无法实现。所以只能通过RPC的方式来

    2024年02月08日
    浏览(42)
  • 【基于netty+zookeeper的rpc远程调用框架】首篇——缘起

    🐼 作者简介:一名大三在校生🎋 空有想法,没有实践 缘起 作为一名即将步入社会的大三学生,我深知一份优秀的简历对于求职的重要性。暑期实习作为大学生涯中的一个重要节点,不仅是锻炼自己、积累经验的宝贵机会,更是向未来雇主展示自己能力和潜力的关键时期。

    2024年04月26日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包