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. webstorm 2018 LICENSE SERVER 最新激活网址

    2018年8月更新:https://s.tuzhihao.com:666 (亲测)

  2. nodejs-QQ空间灌水

    在本地编写javascript代码,node环境下命令行内运行,请求网页实现给QQ好友留言. 1.登录QQ空间,给好友留言,在开发者工具中打开网络面板,在network中找到addXXX开头的请求. ...

  3. PAT乙级考前总结(四)

    散列相关问题 1029 旧键盘 (20 分) 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: ...

  4. C++中const的用法

    1.const修饰普通变量和指针 (1).const修饰普通变量 其写法有2种:a.const type value;   b.type const value; 这两种写法本质上是一样的.其含义是: ...

  5. 图片懒加载 echo.js

    (function (root, factory) { if (typeof define === 'function' && define.amd) { define(functio ...

  6. BLE和2.4G实现通信

    1. 背景 客户的项目是无线控制灯具,目前采用2.4G芯片,一端是2.4G遥控器,一端是2.4G灯具.现在客户的需求是在不增加成本的条件下增加手机APP控制.因为BLE芯片一般会比纯2.4G芯片价格高 ...

  7. 2019CVTE技术支持软件编程

    题目:找出长度为M的数组S中求和为1的任意三个数组合个数,举例:S=[-2, 0, 1, 2, -1, 3],结果为:3个([-2, 0, 3], [-2, 1, 2], [0, 2, -1]). 思 ...

  8. 【java高级编程】JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...

  9. C++——volatile关键字的学习

    首先声明一点,本文是关于volatile关键字的学习,学习内容主要是来自一些大牛的网络博客. 一篇是何登成先生的C/C++ Volatile关键词深度剖析(http://hedengcheng.com ...

  10. java-新建简单的Web项目

    参考链接: https://www.cnblogs.com/silentdoer/articles/7134332.html web.xml: <?xml version="1.0&q ...