RPC 框架設(shè)計
初識 RPC
服務(wù)化有什么好處?
防止代碼拷貝
防止底層復(fù)雜性的擴散
防止公共庫的耦合
保證 SQL 的質(zhì)量,能夠解除數(shù)據(jù)庫的耦合
什么是 RPC
RPC:Remote Procedure Call Protocol,遠程過程調(diào)用協(xié)議,像調(diào)用本地函數(shù)一樣,去調(diào)用一個遠端服務(wù)。
相比“同一個進程”的“本地”函數(shù)調(diào)用,有沒有辦法,調(diào)用一個“跨進程”的“遠程”函數(shù)呢?
Socket 通訊,只能傳遞連續(xù)的字節(jié)流,如何將 “入?yún)?函數(shù)” 放到連續(xù)的字節(jié)流里呢?需要設(shè)計“應(yīng)用層報文(協(xié)議)”
“跨進程”“遠程”調(diào)用的過程

RPC 框架的架構(gòu)職責(zé)
上述跨進程調(diào)用遠端的服務(wù),存在的問題是沒有將通用操作抽離出來。
RPC框架職責(zé):
讓調(diào)用端,像調(diào)用本地函數(shù)一樣,便捷的調(diào)用遠程的服務(wù)
讓服務(wù)端,像提供本地函數(shù)一樣,便捷的提供遠程的服務(wù)
向調(diào)用方屏蔽各種復(fù)雜性,向服務(wù)方也屏蔽各種復(fù)雜性,讓調(diào)用方感覺上就是在調(diào)用本地函數(shù)一樣,來調(diào)用一個遠端的服務(wù);讓服務(wù)方就像實現(xiàn)一個本地函數(shù)一樣,便捷地提供遠端服務(wù)。

序列化與反序列化
為什么需要序列化?
需要將對象等數(shù)據(jù)進行二進制轉(zhuǎn)儲。
所謂序列化,是將“對象”形態(tài)的數(shù)據(jù)轉(zhuǎn)化為“連續(xù)空間二進制字節(jié)流”形態(tài)數(shù)據(jù)的過程。
如何進行序列化?
如何將一個 class User 的內(nèi)存實體 u1 轉(zhuǎn)化為二進制字節(jié)流?
方案一:自描述
自描述的標(biāo)記性語言
(XML/JSON),來進行轉(zhuǎn)換。規(guī)定好轉(zhuǎn)換規(guī)則。方案二:序列化協(xié)議
序號 | key 長度 | key 值 | value 長度 | value 值
序列化協(xié)議設(shè)計,要考慮什么因素?
解析效率
壓縮率,傳輸有效性
擴展性,兼容性
可讀性,可調(diào)試性
跨語言
通用性
常見的序列化方法(協(xié)議)
xml/json
protobuf
Avro
CORBA
mc_pack
字節(jié)流發(fā)送 + 字節(jié)流接收

同步 RPC 系統(tǒng)架構(gòu),核心流程

RPC-server:IO線程,中間是一個隊列,工作線程處理結(jié)果,返回。
連接池組件

異步 RPC 系統(tǒng)架構(gòu),核心流程

調(diào)用方調(diào)用,生成上下文,編程報文,放入隊列;調(diào)用結(jié)束
異步架構(gòu),上下文管理器
為什么需要上下文管理器?
如何將請求-響應(yīng)-回調(diào)等信息匹配起來?

一條連接,異步請求、響應(yīng)報文如何匹配? 可以通過“請求ID”關(guān)聯(lián)!!!
通過“請求ID”關(guān)聯(lián) 請求-響應(yīng)-回調(diào)

異步架構(gòu),超時管理器

RPC-Server
監(jiān)聽一個端口,收發(fā)線程收發(fā)數(shù)據(jù)庫包,中間一個包隊列,工作線程來處理,整個 RPC-Server 就是一個比較簡單的生產(chǎn)者-消費者。
總結(jié)
什么是 RPC?
像調(diào)用本地函數(shù)一樣,去調(diào)用一個遠端服務(wù)
為什么需要 RPC 框架?
用來屏蔽 rpc 調(diào)用過程中,跟業(yè)務(wù)代碼無關(guān)的底層技術(shù)細節(jié)
什么是序列化?為什么需要序列化?
將對象轉(zhuǎn)換為二進制流的過程
同步 RPC-Client 的核心組件是什么?
序列化/反序列化、連接池
異步 RPC-Client 的核心組件是什么?
收發(fā)隊列(用于解耦)、工作線程、上下文管理器
source:https://www.cnblogs.com/ice-image/p/14554250.html
喜歡,在看
