tornado+jsonrpc
rpc:遠端過程呼叫(A服務呼叫B服務的一個方法或函式)
tornado中jsonrpc的使用
import jsonimport tornado.httpserverimport tornado.ioloopimport tornado.webfrom jsonrpcserver.aio import methods#第一個方法@methods.add async def ping(context, **kwargs): return kwargs#第二個方法@methods.add async def ping_one(context, **kwargs): return kwargsclass 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 timefrom jsonrpcclient import HTTPClient req = HTTPClient('')# 請求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://blog.csdn.net/red_heel/article/details/78911252
https://www.cnblogs.com/chunguang/p/5724782.html
原文出處:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_692days_820.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3705/viewspace-2815303/,如需轉載,請註明出處,否則將追究法律責任。