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

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

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

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

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

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

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

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

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

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