RPC(遠程過程調用)的應用

接觸背景

由於工做上某項目的須要設計一種分佈式處理耗時的運算,每一個節點而後將運算結果返回給中心服務器,而最初未了解RPC這部分以前個人設計是在每個RPC服務器上搭建一個webserver,而後部署運算的service在上面,用json的方式通信,這樣確定是能夠實現的,可是部署極其麻煩又讓webserver大材小用還會增長其它腳本語言或者框架的依賴。web

以前也是有據說RPC,我當初也只是覺得是一種概念,且須要本身實現的一種遠程過程調用,沒想到發現有大量現成的庫已經作好了包裝,讓你遠程調用就像本地同樣使用那麼方便。json

RPC介紹

RPC全稱叫Remote Procedure Call,中文叫遠程過程調用,它是一種經過網絡從一臺計算機向另外一臺遠程計算機上所寫的模塊上請求服務,通常是函數調用形式,而不須要本身實現底層變量類型轉換數據再傳輸等網絡技術的協議。安全

優勢

使用者無需關注各個服務器之間調用所需的網絡協議部分(好比tcp分包重傳、http的參數協議制定),能夠把更多的精力花在業務功能邏輯上,特別適合應用在分佈式服務器上。服務器

缺點

安全性一直是RPC的弊病,由於此協議通常沒有用於驗證調用者機制,若是把它直接替代簡單的CURD並暴露給外部用戶使用可能會很快被黑客利用。因此通常應用在企業內網或者設定防火牆ACL或者由遠程計算機自行判斷IP。網絡

RPC實例(Python)

各類不一樣的語言對此都有本身的不一樣解決方案。好比Unix下,C能夠用SUNRPC,Java則可以使用RMI來處理。
Python一樣也提供了一個基於XMLRPC的解決方案,用法很是簡單:
首先,就像在編寫普通的程序那樣子編寫你的模塊或函數。
接着使用xmlrpc.server模塊運行XMLRPC服務器,而且設定綁定IP和Port,以及註冊服務器暴露出去的函數。
最後,在客戶端內使用xmlrpc.client鏈接到服務器,想要調用服務器的函數像在本地的函數同樣直接調用註冊過的函數名便可。框架

XMLRPC server code:異步

# -*- coding:utf-8 -*-
from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn

class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    pass

def add(x, y):
    return x + y

if __name__ == '__main__':
    #rpc_server = SimpleXMLRPCServer(('0.0.0.0', 8848)) #使用這個會讓add函數始終只能同時處理一件事,必須等前一件事情作完才能接新任務
    rpc_server = ThreadXMLRPCServer(('0.0.0.0', 8848)) #支持異步並行接受任務
    rpc_server.register_function(add, "add")
    rpc_server.serve_forever()

XML RPC client code:socket

# -*- coding:utf-8 -*-
import xmlrpc.client

if __name__ == '__main__':
    rpc_client = xmlrpc.client.ServerProxy("http://127.0.0.1:8848")
    print( rpc_client.add(3,4) )
    print( rpc_client.add("a+","b=c") )

首先啓動Server端代碼,再啓動Client代碼,便可獲得輸出的七、a+b=c結果,說明成功透過RPC遠程調用add函數。tcp

到此一個遠程調用就完成了。感謝閱讀,望能對讀者有幫助。分佈式

相關文章
相關標籤/搜索