rpc:远程过程调用(A服务调用B服务的一个方法或函数)

tornado中jsonrpc的使用

import json

import tornado.httpserver
import tornado.ioloop
import tornado.web
from jsonrpcserver.aio import methods #第一个方法
@methods.add
async def ping(context, **kwargs):
return kwargs #第二个方法
@methods.add
async def ping_one(context, **kwargs):
return kwargs class RpcHandler(tornado.web.RequestHandler):
def get(self):
response = methods.dispatch({"jsonrpc": "2.0", "method": "ping", "id": 33, 'params': {'where': 23}},
context={'name': '张三'})
if not response.is_notification:
self.write(response) #通过此接口调用不同的方法
async def post(self):
rpc_request = self.request.body.decode()
response = await methods.dispatch(rpc_request, context={'key': 'one'})
if not response.is_notification:
self.write(json.dumps(response)) def make_app():
settings = {'debug': True}
return tornado.web.Application([
(r'/', RpcHandler),
], **settings) if __name__ == '__main__':
app = make_app()
http_server = tornado.httpserver.HTTPServer(app)
ip = '127.0.0.1'
port = 8000
http_server.bind(8000, ip)
http_server.start(1)
print('server start! http://{}:{}'.format(ip, port))
tornado.ioloop.IOLoop.current().start()

客户端调用代码如下:

import time

from jsonrpcclient import HTTPClient

req = HTTPClient('http://127.0.0.1:8000/')
# 请求ping方法
res = req.request('ping', name=34)
print(res)
time.sleep(1)
# 请求ping_one方法
res = req.request('ping_one', name=35)
print(res)
time.sleep(1)
# 批量请求两个方法
res = req.send('''[{"jsonrpc": "2.0", "method": "ping_one", "params": {"name": 351}, "id": 21},
{"jsonrpc": "2.0", "method": "ping_one", "params": {"name": 352}, "id": 22}
]''')
print(res)

服务端响应如下:

客户端响应如下:

json-rpc是一种非常轻量级的跨语言远程调用协议,实现及使用简单。方便语言扩展客户端的实现。

使用场景:

调用另一个服务的某个方法,相对于接口调用,在代码整洁及解耦方面有优势。并且可以使用批量请求(在所有请求完成后,在一并返回)

并且如果是 频繁请求另一个服务的某种功能,使用rpc比http较为轻量级,并且结合socket使用,达到一个连接中多个请求,减少系统开销

相关网址:https://www.zybuluo.com/phper/note/76641

https://blog.csdn.net/red_heel/article/details/78911252

https://www.cnblogs.com/chunguang/p/5724782.html

tornado+jsonrpc的更多相关文章

  1. jsonrpc使用

    jsonrpc使用 1.什么是rpc RPC(Remote Procedure Call)远程过程调用,简单说就是通过网络请求服务,不需要了解底层网络技术的协议. 常用语分布式应用程序. 2.rpc数 ...

  2. Python(九)Tornado web 框架

    一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  3. 使用tornado,我们可以做什么?

    以下介绍都是建立在python2.x的基础上面,tornado使用任意版本皆可. 如果我们需要对外提供一个http server(web api)/websocket server时,我们都可以使用t ...

  4. tornado session

    [转]tornado入门 - session cookie 和session 的区别: 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以 ...

  5. tornado template

    若果使用Tornado进行web开发可能会用到模板功能,页面继承,嵌套... 多页应用模板的处理多半依赖后端(SPA就可以动态加载局部视图),就算是RESTfull的API设计,也不妨碍同时提供部分模 ...

  6. tornado上手

    http://www.tornadoweb.org/en/stable/ http://www.cnblogs.com/fanweibin/p/5418697.html import tornado. ...

  7. tornado+sqlalchemy+celery,数据库连接消耗在哪里

    随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知.     最近老是发现数据库的连接数如果 ...

  8. centos 6.7 搭建tornado + nginx + supervisor的方法(已经实践)

    首先,本来不想写这篇博客了,但是我测试了很多网上的例子包括简书的,全不行,我总结原因是自己太笨,搞了俩个晚上,后来决定,自己还是写一篇记录下来,保证自己以后使用 环境: centos6.7 64 py ...

  9. tornado中将cookie值设置为json字符串

    不熟悉,找了很久,能FQ的话, https://groups.google.com/forum/#!topic/python-tornado/9Y--NgwjP_w 2楼有解释. tornado.es ...

随机推荐

  1. mysql数据库 事务和索引

    1.MySQL数据库特性:  原子性(atomidity) 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一 ...

  2. E-R视图中有关图形的用法

    这里先推荐几款相对好用的画E-R图的软件: 第一款为:  这是一款在线的画流程图软件 第二款为:亿图图示 第三款为:Visio ER图是在设计数据库之前,明白数据之间的相互关系,理清数据之间的逻辑而需 ...

  3. Node版本管理工具-NVM的安装与使用(windows系统)

    友情提示:为避免踩坑,建议浏览全文后动手操作!!! 一.nvm是什么 看到这篇文章的猿/媛们肯定不会问这个问题了,但是我还是要说,哈哈哈! 无论工作还是干嘛,就不会一直做项目,所以肯定也不会一直用一个 ...

  4. cdcq的独立博客

    cdcq的独立博客终于又复活啦,以后就用这个了 地址: http://cdcq.coding.me 现在用的是luogu的博客:https://cdcq.blog.luogu.org/

  5. JavaScript DOM&BOM

    1.DOM含义 D: Document 文档 一份文档就是一棵节点树,每个节点都是一个对象O:Object 对象 JavaScript语言里对象可以分为三种类型: (1)用户定义的对象(user-de ...

  6. edgedb 基本试用

    环境准备 使用docker-compose 运行 docker-compose 文件 version: "3" services: db: image: edgedb/edgedb ...

  7. Vue --- :is

    1.1 基本示例 <div id="app"> <!-- template slot transition --> <input type=" ...

  8. 我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager

    大家好,  我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager . ServerFulManager 的 目标 是 实现一个 支持 ServerFu ...

  9. D# 语法

    这篇文章 随意 的 记录 关于 D# 语法的想法 . template 和 interface   同时作为一等公民 D# 是程序员的语言,不需要太多包装和修饰, D# 是 简单的, 编译器 和 ID ...

  10. 查看局域网内所有IP的方法

    1,windows下查看局域网内所有IP的方法: 在MS-DOS命令行输入arp -a 2,Linux下,查看局域网内所有IP的方法: 在命令行输入nmap -sP 172.10.3.0/24