jsonrpc使用
1.什么是rpc
RPC(Remote Procedure Call)远程过程调用,简单说就是通过网络请求服务,不需要了解底层网络技术的协议。
常用语分布式应用程序。
2.rpc数据传递格式
rpc支持多种数据格式传递,json,xml等
3.tornado中使用jsonrpc示例
安装服务端包,客户端包
pip install tornado jsonrpcserver
pip install tornado jsonrpcclient
服务端程序如下:
from tornado import ioloop, web
from jsonrpcserver.aio import methods
from jsonrpcserver.response import NotificationResponse
@methods.add
async def ping():
return "pong"
class RpcTestHandler(web.RequestHandler):
async def post(self):
request = self.request.body.decode()
response = await methods.dispatch(request)
if not response.is_notification:
self.write(response)
运行,开始监听
客户端程序如下:
# 同步请求
import jsonrpcclient
jsonrpcclient.request('http://localhost:20000/test_rpc', 'ping')
运行结果如下:
E:\gitcode\tornado-test>python test.py
--> {"jsonrpc": "2.0", "method": "ping", "id": 1}
<-- {"jsonrpc": "2.0", "result": "pong", "id": 1} (200 OK)
# 异步请求
from tornado import ioloop
from jsonrpcclient.tornado_client import TornadoClient
client = TornadoClient('http://localhost:20000/test_rpc')
async def main():
result = await client.request('ping')
print(result)
ioloop.IOLoop.current().run_sync(main)
运行结果如下:
E:\gitcode\tornado-test>python test.py
INFO:jsonrpcclient.client.request:{"jsonrpc": "2.0", "method": "ping", "id": 1}
INFO:jsonrpcclient.client.response:{"jsonrpc": "2.0", "result": "pong", "id": 1}
pong
4.http请求,rpc请求区别
http协议是支持长连接的,因此和rpc的自定义tcp报文协议相比,连接上没有太大区别,
区别在于自定义tcp报文做了优化处理,去除了很多无用信息,这是因为rpc是面向服务的。