RPC(远程过程调用)的应用
接触背景
因为工作上某项目的需要设计一种分布式处理耗时的运算,每个节点然后将运算结果返回给中心服务器,而最初未了解RPC这部分之前我的设计是在每一个RPC服务器上搭建一个webserver,然后部署运算的service在上面,用json的方式通讯,这样肯定是可以实现的,但是部署极其麻烦又让webserver大材小用还会增加其它脚本语言或者框架的依赖。
之前也是有听说RPC,我当初也只是以为是一种概念,且需要自己实现的一种远程过程调用,没想到发现有大量现成的库已经做好了包装,让你远程调用就像本地一样使用那么方便。
RPC介绍
RPC全称叫Remote Procedure Call,中文叫远程过程调用,它是一种通过网络从一台计算机向另一台远程计算机上所写的模块上请求服务,一般是函数调用形式,而不需要自己实现底层变量类型转换数据再传输等网络技术的协议。
优点
使用者无需关注各个服务器之间调用所需的网络协议部分(比如tcp分包重传、http的参数协议制定),可以把更多的精力花在业务功能逻辑上,特别适合应用在分布式服务器上。
缺点
安全性一直是RPC的弊病,因为此协议一般没有用于验证调用者机制,如果把它直接替代简单的CURD并暴露给外部用户使用可能会很快被黑客利用。所以一般应用在企业内网或者设定防火墙ACL或者由远程计算机自行判断IP。
RPC实例(Python)
各种不同的语言对此都有自己的不同解决方案。比如Unix下,C可以用SUNRPC,Java则可使用RMI来处理。
Python同样也提供了一个基于XMLRPC的解决方案,用法非常简单:
首先,就像在编写普通的程序那样子编写你的模块或函数。
接着使用xmlrpc.server模块运行XMLRPC服务器,并且设定绑定IP和Port,以及注册服务器暴露出去的函数。
最后,在客户端内使用xmlrpc.client连接到服务器,想要调用服务器的函数像在本地的函数一样直接调用注册过的函数名即可。
XMLRPC server code:
# -*- coding:utf-8 -*-
from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
pass def add(x, y):
return x + y if __name__ == '__main__':
#rpc_server = SimpleXMLRPCServer(('0.0.0.0', 8848)) #使用这个会让add函数始终只能同时处理一件事,必须等前一件事情做完才能接新任务
rpc_server = ThreadXMLRPCServer(('0.0.0.0', 8848)) #支持异步并行接受任务
rpc_server.register_function(add, "add")
rpc_server.serve_forever()
XML RPC client code:
# -*- coding:utf-8 -*-
import xmlrpc.client if __name__ == '__main__':
rpc_client = xmlrpc.client.ServerProxy("http://127.0.0.1:8848")
print( rpc_client.add(3,4) )
print( rpc_client.add("a+","b=c") )
首先启动Server端代码,再启动Client代码,即可得到输出的7、a+b=c结果,说明成功透过RPC远程调用add函数。
到此一个远程调用就完成了。感谢阅读,望能对读者有帮助。