rpc的简单理解

󰃭 2016-04-18

概念

rpc,全称Remote Procedure Call,即远程过程调用

一般的函数调用都是本地的调用相同物理空间内的函数, 而rpc 则可以调用远程的函数,从而可以将方便的实现分布式的代码部署, 将某些代码块置于符合需求的服务器上, 比如将消耗cpu的函数置于cpu比较强的服务器, I/O较多的函数置于较好磁盘(ssd,固态硬盘等)的服务器

理解

我对rpc的理解: rpc是一种与rest类似的通信机制, 都是要向服务端传递参数并获取某些结果, 只不过这个机制看起来像是函数调用机制。 rpc 不仅仅支持 http, 还支持其他的一些协议甚至是自定义协议

服务端伪代码:

def function_name(a,b):
    ...
    return result
s = service_process()
s.listen(8888) #服务需要绑定端口
s.add(function_name) #需要将对外开放的函数注册了, rpc的客户端才能调用
s.start() 

客户端伪代码

...
c = client_process(serverip:serverport) #连接rpc服务端
c.function_name(a,b) #这里的function_name 就是服务端的函数

客户端对服务端函数的调用非常透明, 使用的时候非常容易

实践

python 的SimpleXMLRPCServer 可以实践rpc服务端注册和客户端调用

这里我们简单的让客户端远程调用服务端的s_add 函数 server.py

from SimpleXMLRPCServer import SimpleXMLRPCServer

def s_add(a,b):
    return a + b

s = SimpleXMLRPCServer(("0.0.0.0",8888))
s.register_function(s_add) #s_add 是在服务端实现的
s.serve_forever()

客户端调用 client.py

import xmlrpclib

c = xmlrpclib.ServerProxy("http://127.0.0.1:8888") #创建连接
a = 1
b = 2
res = c.s_add(a,b) # rpc 调用
print "rpc: s_add(%d,%d)=%d" %(a,b, res)

分别运行server.py和client.py, 在运行客户端时会输出

rpc: s_add(1,2)=3

正是我们远程函数的执行结果

总结

rpc 成功地将项目的代码以分布式的方式部署, 并方便的调用, 这种方式与http的传统的请求响应模式一样, 但又不相同。