什么是 RPC?
RPC(Remote Procedure Call)
远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。在我们日常的开发中使用很是广泛,尤其是在分布式
系统中。
RPC 和 HTTP 有什么区别?
RPC
要求客户端和服务端使用的协议及版本必须一致,而 HTTP
则屏蔽了这部分。假如你的服务端是在 Linux
上用 Go
语言开发的,而客户端是在 windows
上用 Java
开发的,此时你应当选择 HTTP
。
RPC
通常用于微服务内部通信,当你需要使用中间件进行请求转发的时候,你应当选择 HTTP
。
当某个服务的请求量很大且频繁时,对于同等的请求,由于 HTTP
的报文比 RPC
要大很多,所以你应当选择 RPC
。
小结
- HTTP 灵活,跨平台&语言。
- HTTP 相比 RPC 更简单。
- RPC 比 HTTP 更快。
一个例子认识 RPC
服务端
from xmlrpc.server import SimpleXMLRPCServer
# lcoal function
def sayHi(name):
print(f'Hi {name}!')
return f'Hi {name}!'
if __name__ == '__main__':
# server instance
server = SimpleXMLRPCServer(('127.0.0.1',8889),allow_none=True)
# register function to rpc server
# after registered, local function can be call in rpc client
server.register_function(sayHi)
print(f'server listening on 127.0.0.1:8889')
# start rpc server
server.serve_forever()
客户端
from xmlrpc.client import ServerProxy
if __name__ == '__main__':
# start rpc client
with ServerProxy('http://127.0.0.1:8889',allow_none=True) as client:
# call server function sayHi
res = client.sayHi('phyger')
print(res)
如上,我们可以看到客户端成功调用了服务端的方法并且返回了期望的结果。
RPC 流程简析
RPC
服务端实际是基于 TPC
的 socket
连接,它将服务暴露在主机的某个端口上,客户端通过这个端口和服务端建立连接,然后调用 RPC API
,让服务端的方法在服务端运行,同时服务端将返回值发送给客户端。
更好用的 RPC 库
因为 xmlrpc
是 Python
自带的,而且无法跨语言,鉴于此,有大神就推出了一款更加人性化的 RPC
库:hprose(High-Performance Remote Object Service Engine)
。
hprose
可以跨语言使用,目前其支持 Java
,.NET
,Golang
,PHP
,C
,Python
等超过 20
种语言。
服务端
# from xmlrpc.server import SimpleXMLRPCServer
# # lcoal function
# def sayHi(name):
# print(f'Hi {name}!')
# return f'Hi {name}!'
# if __name__ == '__main__':
# # server instance
# server = SimpleXMLRPCServer(('127.0.0.1',8889),allow_none=True)
# # register function to rpc server
# # after registered, local function can be call in rpc client
# server.register_function(sayHi)
# print(f'server listening on 127.0.0.1:8889')
# # start rpc server
# server.serve_forever()
import hprose
def sayHi(name):
print(f'Hi,{name}!')
return f'Hi,{name}!'
def sayBye(name):
print(f'Bye,{name}!')
return f'Bye,{name}!'
def main():
# create rpc server instance
server = hprose.HttpServer(host='localhost',port=8880)
# add single function
# server.addFunction(sayHi)
# add more functions
server.addFunctions([sayHi,sayBye])
# start rpc server
server.start()
if __name__ == '__main__':
print('server listening on localhost:8880')
main()
客户端
import hprose
def main():
# start rpc client
client = hprose.HttpClient('http://localhost:8880')
# call server function sayHi & sayBye
res1 = client.sayHi('Python测试和开发')
res2 = client.sayBye('Python测试和开发')
print(res1,'\n'+res2)
if __name__ == '__main__':
main()
以上就是今天的全部内容了,感谢您的阅读,我们下节再会。
评论区