一個簡單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。
相關文章
- 徒手擼一個簡單的RPC框架RPC框架
- mybatis是怎樣煉成的MyBatis
- 黑客是怎樣煉成的黑客
- React 是怎樣煉成的React
- Flutter bot_toast是怎樣煉成的FlutterAST
- 一朵體驗好的雲是怎樣煉成的?
- 千億級HttpDNS服務是怎樣煉成的httpdDNS
- 航空公司系統是怎樣煉成的?
- HR「最強大腦」是怎樣煉成的?
- 一家法律智慧公司的CTO是怎樣煉成的?
- 走近原始碼:壓縮列表是怎樣煉成的原始碼
- 從零實現一個RPC框架系列文章(二):11個類實現簡單RPCRPC框架
- 【進階】前端幸福感是怎樣煉成的(上)前端
- 【進階】前端幸福感是怎樣煉成的(下)前端
- 你說說RPC的一個請求的流程是怎麼樣的?RPC
- 動手實現一個簡單的 rpc 框架到入門 grpc (下)RPC框架
- 動手實現一個簡單的 rpc 框架到入門 grpc(上)RPC框架
- 動手實現一個簡單的 rpc 框架到入門 grpc (上)RPC框架
- Java 簡單的rpc 一JavaRPC
- 北京文化董事長宋歌:爆款是怎樣煉成的
- 規模化敏捷 LeSS(三):LeSS Huge 是怎樣煉成的?敏捷
- “毒瘤”Epic是怎樣煉成的?不到三個月就讓自己的形象盡毀
- 自己用 Netty 實現一個簡單的 RPCNettyRPC
- HarmonyOS智慧座艙體驗是怎樣煉成的?立即檢視
- 一個簡簡單單的紅點系統框架框架
- 赫卡忒的眼眸:微光手機“夜視儀”是怎樣煉成的?
- 從零開始實現簡單 RPC 框架 1:RPC 框架的結構和設計RPC框架
- 【Flutter 元件集錄】Switch 是怎樣煉成的| 8月更文挑戰Flutter元件
- Golang快速實現一個簡單RPC服務GolangRPC
- 一個很簡單的PHP框架lyuePHP框架
- 《重灌上陣》:品類融合新思路 一款“科幻沙盒FPS”是怎樣煉成的?
- 曾登頂全球21地區的《弓箭傳說》悄然回國 超休閒爆款是怎樣煉成的?
- 優秀的資料分析師是這樣煉成的
- twirp: 支援protobuf服務定義的簡單RPC框架RPC框架
- RPC框架是啥?RPC框架
- 【Flink】Flink 底層RPC框架分析RPC框架
- 使用Netty和動態代理實現一個簡單的RPCNettyRPC
- 關於SSM框架的一個簡單DemoSSM框架
- 一個超級簡單的 go Web 框架GoWeb框架