python与rpc服务
什么是rpc
随着企业 IT 服务的不断发展,单台服务器逐渐无法承受用户日益增长的请求压力时,就需要多台服务器联合起来构成「服务集群」共同对外提供服务。
同时业务服务会随着产品需求的增多越来越肿,架构上必须进行服务拆分,一个完整的大型服务会被打散成很多很多独立的小服务,每个小服务会由独立的进程去管理来对外提供服务,这就是「微服务」。
当用户的请求到来时,我们需要将用户的请求分散到多个服务去各自处理,然后又需要将这些子服务的结果汇总起来呈现给用户。那么服务之间该使用何种方式进行交互就是需要解决的核心问题。
RPC 就是为解决服务之间信息交互而发明和存在的。
RPC(Remote Procedure Call)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
在服务器端,进程保持睡眠状态直到调用信息到达为止。
当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息
然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC就是一种远程调用函数接口的方式,说白了,就是一种远程调用函数接口的方式,客户端和服务端之间约定一种契约(函数接口),然后服务端一直等待客户端的调用。
有点像平常的WEB网络请求。
一种用途是在多台服务器之间互相进行调用。
另一个用途则在于,不同编程语言之间都支持这种方式,像Python更是内置对其的支持,不需要额外安装什么库,所以可以直接在多语言的服务器之间互相进行调用。
Socket编程就是RPC通信
HTTP与RPC
这两者的关系好比
- HTTP(普通话)
- RPC(方言)
要进行跨企业服务调用时,往往都是通过 HTTP API,也就是普通话,虽然效率不高,但是通用,没有太多沟通的学习成本。
但是在企业内部还是 RPC 更加高效,同一个企业公用一套方言进行高效率的交流,要比通用的 HTTP 协议来交流更加节省资源。
中国各地都有自己方言,你回了老家还是流行说方言
本质上,普通话也是一种方言,只不过是官方的方言,使用的最广泛的方言。
Nginx与RPC
Ngnix 是互联网企业使用最为广泛的代理服务器。
它可以为后端分布式服务提供负载均衡的功能,它可以将后端多个服务地址聚合为单个地址来对外提供服务。
如图,Django 是 Python 技术栈最流行的 Web 框架。
你可能会问,python web部署不是用的uwsgi吗,是的,也可以走uwsgi协议,它是比HTTP协议更省流量的二进制协议。
uwsgi 通讯协议在 Python 语言体系里使用非常普遍,如果一个企业内部使用 Python 语言栈搭建 Web 服务,那么他们在生产环境部署 Python 应用的时候不是在使用 HTTP 协议就是在使用 uwsgi 协议来和 Nginx 之间建立通讯。
RPC交互
RPC是两个子系统之间进行的直接消息交互,使用操作系统提供的套接字作为消息的载体
python的socket编程就是一种RPC通信
rpc_server.py
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 8080))
sock.listen(1) # 监听客户端连接
while True:conn, addr = sock.accept() # 接收一个客户端连接print(conn.recv(1024)) # 从接收缓冲读消息 recv bufferconn.sendall(b"world") # 将响应发送到发送缓冲 send bufferconn.close() # 关闭连接
rpc_client.py
import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 8080)) # 连接服务器
sock.sendall(b"hello") # 将消息输出到发送缓冲 send buffer
print(sock.recv(1024)) # 从接收缓冲 recv buffer 中读响应
sock.close() # 关闭套接字...
xmlrpc库
简单的服务端
像web请求一样,我们需要确定供客户端访问的url和端口号,以及供客户端调用的方法实现,最后要让我们服务器一直处于等待被访问的状态:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from xmlrpc.server import SimpleXMLRPCServer# 调用函数
def respon_string(str):return "get string:%s"%strif __name__ == '__main__':server = SimpleXMLRPCServer(('localhost', 8888)) # 初始化server.register_function(respon_string, "get_string") # 注册函数print ("Listening for Client")server.serve_forever() # 保持等待调用状态
可以看到,代码中就实现了上面说的几点。
register_function用于注册一个供调用的函数,第一个参数为自己实现的方法名,第二个参数为供客户端调用的方法名。
简单的客户端
根据url和端口号初始化一个服务器对象,然后调用需要的方法即可:
from xmlrpc.client import ServerProxyif __name__ == '__main__':server = ServerProxy("http://localhost:8888") # 初始化服务器print (server.get_string("oldboy_python6666")) # 调用函数并传参
分别启动服务端和客户端,客户端即可远程调用服务端的功能函数
saltstack就是基于rpc远程调用命令
python与rpc服务相关推荐
- python 调用rpc服务_在Django项目中对Python函数进行RPC调用的优雅方式
我正在尝试创建一个django网站来访问MySQL数据库中的数据.其目的是在Dojo(javascript)中创建一个UI.另外,我希望django后端也提供webservices(RPC for p ...
- golang python rpc_grpc - 使用 golang 带你从头撸一套 RPC 服务(一)
gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多复用请求等特.这些特性使得其在移动设备上表现更好,更省电和节省 ...
- 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务
RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要 ...
- 基于 Python 自建分布式高并发 RPC 服务
RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要 ...
- centos部署python flask_python 微服务框架之nameko实践
大纲: 1.本篇关键技术点及其释义 2.实际需求和目标 3.可行的三大解决方案 4.微服务与传统服务的差别 5.代码大纲:安装依赖及nameko五个完整的代码示例 6.附录:docker的在线安装方式 ...
- go 简单的RPC服务与客户端通讯
2019独角兽企业重金招聘Python工程师标准>>> // 服务器代码 package main// rpc 服务 import ("net/rpc"" ...
- 技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
- python rpc_对python调用RPC接口的实例详解
要调用RPC接口,python提供了一个框架grpc,这是google开源的 rpc相关文档: 需要安装的python包如下: 1.grpc安装 pip install grpcio 2.grpc的p ...
- 视频教程-RPC服务框架(Dubbo)源码分析-Java
RPC服务框架(Dubbo)源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大 ...
最新文章
- 从javascript发展说到vue
- 德国机器人公司库卡出售美国业务 为美的收购做准备
- 运维常说的 5个9、4个9、3个9 的可靠性,到底是什么???
- 机器学习:决策树过拟合与剪枝,决策树代码实现(三)
- Log4Net 最简配置
- ant 驱动 svnkit 下载代码
- vue笔记(一)基本使用、数据检测
- php如何与数据库连接,PHP文章如何和数据库连接(1)
- 2020暨阳学院园林计算机考研考场,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
- php7与golang,golang 调用 php7
- Android中OnItemClick的四个参数意义
- Path(2)之verp中path position和path length的区别
- 差距缩小 WLAN市场销量逼近有线网络
- 谷歌浏览器截图_谷歌浏览器如何截图?
- c语言如何交替打印大小写字母,C/C++语言实现两个线程交替打印奇偶数
- windows软链接
- openstack controller ha测试环境搭建记录(二)——配置corosync和pacemaker
- HiWork告诉你:拿什么来拯救你,我的时间
- 女超人、女强人……究竟是谁在以“女”设限?
- win10pin不可用进不去系统_人脸识别门禁控制系统+安检通道