RPC概念
1. 概念
RPC是系统间的一种通信方式,就是从一台机器上通过参数传递的方式调用另一台机器上的一个函数或方法并得到返回的结果。
2. 原因
无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯。由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用
RPC框架
- thrift,Finagle,dubbo,grpc,json-rpc等
RPC框架应该具备的特点
- 具有服务的分层设计,借鉴Future/Service/Filter概念
- 具有网络的分层设计,区分协议层、数据层、传输层、连接层
- 独立的可适配的codec层,可以灵活增加HTTP,Memcache,Redis,MySQL/JDBC,Thrift等协议的支持。
- 将多年各种远程调用的经验融入在实现中,如负载均衡,failover,多副本策略,开关降级等。
- 通用的远程调用实现,采用异步方式来减少业务服务的开销,并通过future分离远程调用与数据流程的关注。
- 具有状态查看及使用统计功能
- 具备通用的远程容错处理能力,如超时、重试、负载均衡、failover等
RPC调用流程
- 服务消费者(Client 客户端)通过本地调用的方式调用服务
- 客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体
- 客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端
- 服务端存根(Server Stub)收到消息后进行解码(反序列化操作)
- 服务端存根(Server Stub)根据解码结果调用本地的服务进行相关处理
- 服务端(Server)本地服务业务处理
- 处理结果返回给服务端存根(Server Stub)
- 服务端存根(Server Stub)序列化结果
- 服务端存根(Server Stub)将结果通过网络发送至消费方
- 客户端存根(Client Stub)接收到消息,并进行解码(反序列化)
- 服务消费方得到最终结果
Python3调用RPC简单应用
- [server端]
#] server.py
from xmlrpc.server import SimpleXMLRPCServer
def fun_add(a, b):
totle = a + b
return totle
if __name__ == '__main__':
s = SimpleXMLRPCServer(('0.0.0.0', 8088)) # 开启xmlrpcserver
s.register_function(fun_add) # 注册函数fun_add
print("server is online...")
s.serve_forever() # 开启循环等待
#] python server.py
server is online... [挂起,等待连接]
-
- [client端]
]# client.py
from xmlrpc.client import ServerProxy
s = ServerProxy("http://192.168.89.134:8088") #定义xmlrpc客户端
print(s.fun_add(2,3))
]# python client.py
5
- Python3调用RPC多线程访问
1. 客户端不用更改,只需动用服务端即可实现多客户端访问调用
2. server.py
from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
pass
def fun_add(a, b):
totle = a + b
return totle
def fun_delf(a, b):
result = a - b
return result
if __name__ == '__main__':
s = SimpleXMLRPCServer(('0.0.0.0', 8088)) # 开启xmlrpcserver
s.register_function(fun_add, "add") # 注册函数1
s.register_function(fun_delf, "delf") # 注册函数2
print("server is online...")
s.serve_forever() # 开启循环等待
3. client.py
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.client import ServerProxy
s = ServerProxy("http://192.168.89.134:8088") #定义xmlrpc客户端
print(s.add(2,3))
print(s.delf(2,3))