一個簡單RPC框架是怎樣煉成的(V)——引入傳輸層
開局篇我們說了,RPC框架的四個核心內容
-
RPC資料的傳輸。
- RPC訊息 協議
- RPC服務註冊
- RPC訊息處理
並且詳細的傳輸通道使用socket或者其它的方式,如更上層的http,或者android裡的binder,都是可替換的。僅僅是詳細的一種實現而已。所以,這裡我就偷個懶,僅僅是引入一個非常easy的Connection類。用來描寫敘述一下怎樣將傳輸資料 這一層給獨立出來。
(實現沒有考慮多執行緒安全。實際是必須考慮的)。
class Connection(object): ``` @RPC 連線。
一般說來。都是socket連線。這裡簡化起見,直接本地變數實現。
“`
def __init__(self, sending_msg_list, recving_msg_list):
“`
Constructor
“`
self.sending_msg_list = sending_msg_list
self.recving_msg_list = recving_msg_list
def send(self, message):
self.sending_msg_list.append(message)
def recv(self):
while len(self.recving_msg_list) == 0: time.sleep(0.01)
return self.recving_msg_list.pop(0)
def isClosed(self):
return False
有了這個connection,剩下的就僅僅要將rpc訊息統統通過這個connection去傳送。通過這個Connection去接收。
然後等待connection收到server端的回覆,將回復訊息從connection中取出來。
def request(self, req): # 所有簡化處理。不考慮執行緒安全問題,不考慮非同步 # 先是將RPC訊息傳送到服務端,然後服務端就會處理,並將結果發回到client,client這邊接收處理結果。 # self.remote.procRequest(req) // 刪除 self.conn.send(req) rsp = self.conn.recv() return rsp.result
相同的,改動服務端收到request請求後的處理。首先重複呼叫connection.recv()方法讀取客戶端發過來的請求。當請求處理完畢後,不再直接以函式返回的方式return。而是將rsp交給connection。由connection負責傳輸給client
# def procRequest(self, req): 調整引數列表,不再須要req def procRequest(self): # 迴圈讀取並處理收到的客戶端請求 while True: req = self.conn.recv() rsp = Response() rsp.id = req.id if req.command == `sayHello`: rsp.result = self.sayHello() elif req.command == `whoAreYou`: rsp.result = self.whoAreYou() else: raise Exception("unknown command") # return rsp # rsp也是通過connection終於傳給client。而不是直接函式返回 self.conn.send(rsp)
最後。列一下connection的初始化
slist = [] rlist = [] client = Client(Connection(slist, rlist)) server = Server(Connection(rlist, slist)) server.start()
總結,引入傳輸層的意義在於
實際比較理想的情況。應該起碼有個類,Connector,以及Channel。當中channel僅僅負責資料的傳輸,Connector負責管理channel。
相關文章
- 黑客是怎樣煉成的黑客
- mybatis是怎樣煉成的MyBatis
- React 是怎樣煉成的React
- 黑客是怎樣煉成的?黑客
- 開源是怎樣煉成的?
- 大師是怎樣煉成的
- 徒手擼一個簡單的RPC框架RPC框架
- 技術文章是怎樣煉成的?
- Flutter bot_toast是怎樣煉成的FlutterAST
- 【iOS開發】SnapKit是怎樣煉成的iOSAPK
- 簡易版Swiper是怎麼煉成的
- 航空公司系統是怎樣煉成的?
- 千億級HttpDNS服務是怎樣煉成的httpdDNS
- SnapKit 是怎樣煉成的 | 掘金技術徵文APK
- 盲人程式設計師是怎樣煉成的程式設計師
- 一家法律智慧公司的CTO是怎樣煉成的?
- 走近原始碼:壓縮列表是怎樣煉成的原始碼
- 【進階】前端幸福感是怎樣煉成的(下)前端
- 【進階】前端幸福感是怎樣煉成的(上)前端
- 田永強:優秀的JavaScript模組是怎樣煉成的JavaScript
- 規模化敏捷 LeSS(三):LeSS Huge 是怎樣煉成的?敏捷
- 基於akka與scala實現一個簡單rpc框架RPC框架
- 你說說RPC的一個請求的流程是怎麼樣的?RPC
- HarmonyOS智慧座艙體驗是怎樣煉成的?立即檢視
- 新手指南——優秀平面設計師是怎樣煉成的
- 菜鳥指南——優秀平面設計師是怎樣煉成的
- 小島秀夫:全世界粉絲最多的遊戲製作人是怎樣煉成的遊戲
- 從零實現一個RPC框架系列文章(二):11個類實現簡單RPCRPC框架
- 軟體設計是怎樣煉成的(1)——什麼是優秀的設計?
- Java 簡單的rpc 一JavaRPC
- 讓維護人員抓狂的程式設計師是怎樣煉成的程式設計師
- Java實現最簡單的RPC框架JavaRPC框架
- 動手實現一個簡單的 rpc 框架到入門 grpc (上)RPC框架
- 動手實現一個簡單的 rpc 框架到入門 grpc (下)RPC框架
- 動手實現一個簡單的 rpc 框架到入門 grpc(上)RPC框架
- 【Flutter 元件集錄】Switch 是怎樣煉成的| 8月更文挑戰Flutter元件
- 一個簡簡單單的紅點系統框架框架
- 軟體設計是怎樣煉成的(7)——細節決定成敗(詳細設計)