系統邊界
什麼是系統邊界?系統邊界就是在系統設計之初,對系統所要實現的功能進行界定,不亂新增,不多新增。這麼做的好處就是,系統簡單明瞭,主旨明確,方便開發和使用者使用。舉個例子,一個自動售貨機的本職工作是自動售貨,使用者投入零錢,選擇商品,出貨,找零,功能簡單明瞭。但是,工程師非要再給售貨機新增一個播放音樂的功能,原因是能夠提升使用者感受,使用者在買東西的時候聽音樂會心情舒暢,這明顯就是亂加功能。更麻煩的是,有一天播放音樂的功能出了故障,由於售貨過程依賴音樂播放功能,售貨也跟著不能用了,這會更糟糕。如果買東西和播放音樂是獨立的,那麼即使音樂播放不成功,也不影響使用者購買,而現在使用者只能眼巴巴看著售貨機不斷的罵售貨機的設計者是個傻X。
那麼SimpleRpc的功能邊界是什麼呢?SimpleRpc只提供一個跨網路RPC框架,使用者程式碼在固定的錨點插入,來完成這個RPC呼叫。
- 這個RPC不保證資料安全。有些rpc會使用ssl進行資料加密,但是SimpleRpc不考慮這種問題,因為服務呼叫在同一個機房內進行,不會涉及到外網資料傳輸,故不考慮資料加密。
- SimpleRpc不支援服務發現機制。有些Rpc會順帶實現服務註冊以及發現功能,比如GRPC。但是我們的服務就是展示一個簡單的RPC呼叫,其它功能忽略。
- SimpleRpc只有C++語言程式碼,暫時不支援其它語言。因為,這個框架只是學習交流的目的,不推薦用在生產環境。
- SimpleRpc不需要IDL(介面描述語言)檔案。因為我們就是要略去IDL轉換成程式碼這個繁瑣的步驟,我們隱含預設服務端提供固定的計算服務,要求客戶端和服務端配套使用。
- SimpleRpc不提供資料的序列化和反序列化功能,我們只專注於RPC呼叫框架實現,序列化和反序列化可以使用第三方開源軟體protobuf完成。
整體架構
客戶端請求以及服務端響應的整個流程:
- 客戶端序列化請求資料後,通過socket傳送給伺服器。
- 服務端網路事件監聽響應器捕捉到socket上的讀事件(由於客戶端傳送了資料,服務端socket上會有讀訊號返回,告訴服務端可讀)。
- 服務端響應器把讀事件放到事件佇列中。
- 服務端工作執行緒從佇列中獲取事件。
- 服務端工作執行緒通過事件繫結的埠讀取客戶端請求,進行反序列化,呼叫使用者層面的請求處理程式碼(例如做加法)。
- 服務端工作執行緒把使用者層面的處理生成的響應資料序列化成位元組流,通過socket傳送回客戶端。
- 客戶端網路事件監聽響應器捕捉到socket上的讀事件(由於服務端傳送了響應資料,客戶端socket上會有讀訊號返回,告訴客戶端可讀)。
- 利用客戶端響應器執行緒讀取網路資料,反序列化,並把響應返回給使用者層面程式碼。
從這個模型中可以看到,客戶端與服務端都是用網路事件監聽響應器獲取網路事件,不同的地方是服務端採用工作執行緒反序列化、計算,而客戶端使用反應器執行緒做數反序列化。