tornado+jsonrpc

starkbl發表於2021-09-09

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/,如需轉載,請註明出處,否則將追究法律責任。