python与rpc服务

【自取】最近整理的,有需要可以领取学习:

什么是rpc

随着企业 IT 服务的不断发展,单台服务器逐渐无法承受用户日益增长的请求压力时,就需要多台服务器联合起来构成「服务集群」共同对外提供服务。

同时业务服务会随着产品需求的增多越来越肿,架构上必须进行服务拆分,一个完整的大型服务会被打散成很多很多独立的小服务,每个小服务会由独立的进程去管理来对外提供服务, 这就是「微服务」。

当用户的请求到来时,我们需要将用户的请求分发到多个服务分别处理,然后需要聚合这些子服务的结果并呈现给用户。那么服务之间如何交互就是需要解决的核心问题。

[En]

When the user’s request comes, we need to distribute the user’s request to multiple services to deal with separately, and then we need to aggregate the results of these sub-services and present them to the user. Then how to interact between services is the core problem that needs to be solved.

RPC 就是为解决服务之间信息交互而发明和存在的。

RPC(Remote Procedure Call)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

首先,客户端调用流程向服务流程发送带有流程参数的调用消息,然后等待回复消息。

[En]

First, the client invocation process sends a call message with process parameters to the service process, and then waits for the reply message.

在服务器端,进程保持睡眠状态直到调用信息到达为止。

当呼叫消息到达时,服务器获取过程参数,计算结果,并发送回复消息。

[En]

When a call message arrives, the server gets the process parameters, calculates the result, and sends a reply message.

然后等待下一个调用消息,最后,客户端调用流程接收回复消息,得到流程结果,然后调用执行继续。

[En]

Then wait for the next call message, and finally, the client invokes the process to receive the reply message, get the process result, and then call execution to continue.

RPC就是一种远程调用函数接口的方式,说白了,就是一种远程调用函数接口的方式,客户端和服务端之间约定一种契约(函数接口),然后服务端一直等待客户端的调用。

有点像平常的WEB网络请求。

一种用途是在多台服务器之间互相进行调用。

另一个用途则在于, 不同编程语言之间都支持这种方式,像Python更是内置对其的支持,不需要额外安装什么库,所以可以直接在多语言的服务器之间互相进行调用。

Socket编程就是RPC通信

HTTP与RPC

这两者的关系好比

  • HTTP(普通话)
  • RPC(方言)

要进行跨企业服务调用时,往往都是通过 HTTP API,也就是普通话,虽然效率不高,但是通用,没有太多沟通的学习成本。

但是在企业内部还是 RPC 更加高效,同一个企业公用一套方言进行高效率的交流,要比通用的 HTTP 协议来交流更加节省资源。

中国各地都有自己方言,你回了老家还是流行说方言

从本质上讲,普通话也是一种方言,但官方方言是使用最广泛的方言。

[En]

In essence, Putonghua is also a dialect, but the official dialect, the most widely used dialect.

Nginx与RPC

Ngnix 是互联网企业使用最为广泛的代理服务器。

它可以为后端分布式服务提供负载均衡功能,并可以将多个后端服务地址聚合到一个地址中提供服务。

[En]

It can provide load balancing function for back-end distributed services, and it can aggregate multiple back-end service addresses into a single address to provide services.

如图,Django 是 Python 技术栈最流行的 Web 框架。

python与rpc服务

你可能会问,python web部署不是用的uwsgi吗,是的,也可以走 uwsgi协议,它是比HTTP协议更省流量的二进制协议。

python与rpc服务

uwsgi 通讯协议在 Python 语言体系里使用非常普遍,如果一个企业内部使用 Python 语言栈搭建 Web 服务,那么他们在生产环境部署 Python 应用的时候不是在使用 HTTP 协议就是在使用 uwsgi 协议来和 Nginx 之间建立通讯。

RPC交互

RPC是两个子系统之间进行的直接消息交互,使用操作系统提供的套接字作为消息的载体

python的socket编程就是一种RPC通信

rpc_server.py

import socket

sock = 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 buffer
    conn.sendall(b"world")  # 将响应发送到发送缓冲 send buffer
    conn.close() # 关闭连接

rpc_client.py

import socket

sock = 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和端口号,以及供客户端调用的方法实现,最后要让我们服务器一直处于等待被访问的状态:

from xmlrpc.server import SimpleXMLRPCServer

# 调用函数
def respon_string(str):
    return "get string:%s"%str

if __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 ServerProxy

if __name__ == '__main__':
    server = ServerProxy("http://localhost:8888") # 初始化服务器
    print (server.get_string("oldboy_python6666")) # 调用函数并传参

分别启动服务端和客户端,客户端即可远程调用服务端的功能函数

saltstack就是基于rpc远程调用命令

Original: https://www.cnblogs.com/pyyu/p/11558669.html
Author: py鱼
Title: python与rpc服务

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/15709/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部