雲端計算開發-RPC應用

mx_steve發表於2020-10-12

RPC概念

             1. 概念

                   RPC是系統間的一種通訊方式,就是從一臺機器上通過引數傳遞的方式呼叫另一臺機器上的一個函式或方法並得到返回的結果。

              2. 原因

                   無法在一個程式內,甚至一個計算機內通過本地呼叫的方式完成的需求,比如不同的系統間的通訊,甚至不同的組織間的通訊。由於計算能力需要橫向擴充套件,需要在多臺機器組成的叢集上部署應用

RPC框架

  1. thrift,Finagle,dubbo,grpc,json-rpc等

RPC框架應該具備的特點

  1. 具有服務的分層設計,借鑑Future/Service/Filter概念
  2. 具有網路的分層設計,區分協議層、資料層、傳輸層、連線層
  3. 獨立的可適配的codec層,可以靈活增加HTTP,Memcache,Redis,MySQL/JDBC,Thrift等協議的支援。
  4. 將多年各種遠端呼叫的經驗融入在實現中,如負載均衡,failover,多副本策略,開關降級等。
  5. 通用的遠端呼叫實現,採用非同步方式來減少業務服務的開銷,並通過future分離遠端呼叫與資料流程的關注。
  6. 具有狀態檢視及使用統計功能
  7. 具備通用的遠端容錯處理能力,如超時、重試、負載均衡、failover等

RPC呼叫流程

  1. 服務消費者(Client 客戶端)通過本地呼叫的方式呼叫服務
  2. 客戶端存根(Client Stub)接收到呼叫請求後負責將方法、入參等資訊序列化(組裝)成能夠進行網路傳輸的訊息體
  3. 客戶端存根(Client Stub)找到遠端的服務地址,並且將訊息通過網路傳送給服務端
  4. 服務端存根(Server Stub)收到訊息後進行解碼(反序列化操作)
  5. 服務端存根(Server Stub)根據解碼結果呼叫本地的服務進行相關處理
  6. 服務端(Server)本地服務業務處理
  7. 處理結果返回給服務端存根(Server Stub)
  8. 服務端存根(Server Stub)序列化結果
  9. 服務端存根(Server Stub)將結果通過網路傳送至消費方
  10. 客戶端存根(Client Stub)接收到訊息,並進行解碼(反序列化)
  11. 服務消費方得到最終結果

Python3呼叫RPC簡單應用

  1. [server端]
#] server.py

from xmlrpc.server import SimpleXMLRPCServer
def fun_add(a, b):
    totle = a + b
    return totle
if __name__ == '__main__':
    s = SimpleXMLRPCServer(('0.0.0.0', 8088))  # 開啟xmlrpcserver
    s.register_function(fun_add)  # 註冊函式fun_add
    print("server is online...")
    s.serve_forever()  # 開啟迴圈等待

#] python server.py

server is online... [掛起,等待連線]
    1. [client端]
]# client.py

from xmlrpc.client import ServerProxy

s = ServerProxy("http://192.168.89.134:8088") #定義xmlrpc客戶端

print(s.fun_add(2,3))

]# python client.py

5
  1. Python3呼叫RPC多執行緒訪問

               1. 客戶端不用更改,只需動用服務端即可實現多客戶端訪問呼叫

               2. server.py

from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn

class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    pass

def fun_add(a, b):
    totle = a + b
    return totle

def fun_delf(a, b):
    result = a - b
    return result

if __name__ == '__main__':
    s = SimpleXMLRPCServer(('0.0.0.0', 8088))  # 開啟xmlrpcserver
    s.register_function(fun_add, "add")  # 註冊函式1
    s.register_function(fun_delf, "delf")  # 註冊函式2
    print("server is online...")
    s.serve_forever()  # 開啟迴圈等待

 

          3. client.py

from xmlrpc.server import SimpleXMLRPCServer

from xmlrpc.client import ServerProxy

s = ServerProxy("http://192.168.89.134:8088") #定義xmlrpc客戶端

print(s.add(2,3))

print(s.delf(2,3))

 

相關文章