概述
DMicro中的drpc組件的思想是參考erpc實現,甚至可以說是它的繼承者。
drpc組件是DMicro框架的一部分,為了適配DMicro框架,在erpc的基礎上做了深入的擴展開發。
整個DMicro大量使用goframe中的組件,如果業務使用goframe框架,可以無縫接入。
DRpc特性列表:
高性能,非阻塞異步IO
自定義Proto,,兼容http協議,自定義Codec
Hook點,插件系統,
Push消息,session管理,Socket抽象,
斷線重連,過載保護,負載均衡,心跳機制,
平滑重啟...
DServer特性列表:
快速構建,平滑重啟,多進程支持,單/多進程一致
預定義命令行,ctrl命令管理服務
可觀測,可控制,應用沙盒
DMicro已經內置組件:
[x]Registry服務注冊
[x]Selector服務發現
[x]Eventbus事件總線
[x]Supervisor進程管理
[ ]Code gen代碼生成
[ ]Tracing鏈路追蹤
[ ]Metrics統計告警
[ ]Broker限流熔斷
[ ]OpenAPI文檔自動生成
架構
設計理念
對DMicro框架的設計,從設計之初就是在追求靈活性,適應性。在保證微服務的穩定性前提下,追求項目的開發效率。
面向接口設計,保證代碼穩定,提供靈活定制。
抽象各組件的接口,高內聚,低耦合。
分層設計,自上而下逐層封裝,利于穩定和維護。
高性能,高可用,低消耗。
對開發友好,封裝復雜度。
提供豐富的組件及功能,讓開發專注業務。
無數個寫DMicro的日夜,我都謹記開發三原則:
Clarity(清晰)
Simplicity(簡單)
Productivity(生產力)
無論工作,還是做開源項目,都應該保持這三個原則,養成良好的習慣。
面向接口設計
DMicro秉承著萬物皆接口的原則,提供框架無與倫比的擴展性.
下圖展示的是消息的發送的流轉流程,可以看到,所有的功能點都被抽象成了接口,每個功能點都提供了不同的實現.
會話 Session
大多數的Rpc框架并不強調會話 (session) 的概念,因其應用場景不需要用到會話 (session). 那么drpc為什么需要抽象出會話 (session) 呢?
Endpoint融合了Client和Server, 需要提供相同的Api.
服務端需要主動向客戶端發送消息,并且獲取客戶端的響應.
服務端支持對多個客戶端批量發送消息.
異步主動斷開一個或多個會話.
獲取會話底層的文件描述符, 對其進行性能調優.
可以為每個會話綁定特殊的數據/屬性.
Session抽象了整個drpc框架的會話,把Socket,Message,Context都融合到一起。開發者只需要對session進行操作,就能實現大多數需求.
獲取連接信息
控制連接的生命周期 (超時時間)
控制單次請求的生命周期 (超時時間)
接收消息
發送消息
創建消息的上下文
綁定會話的相關信息 (如用戶信息)
斷線重連
主動斷開會話.
健康檢查
獲取連接關閉事件
為會話設置單獨的 id
Session接口可以細分為 4 個interface{}, 分別是EarlySession,BaseSession,CtxSession,Session. 對應的是應用的不同生命階段會話 (Session) 擁有的不同屬性.
EarlySession表示剛生成會話,尚未啟動 goroutine 讀取數據的階段.
BaseSession只有最基礎的方法,用于關閉連接時候的插件參數.
CtxSession在處理程序上下文中傳遞的會話對象.
Session全功能的會話對象.
正常情況下,開發者用到的都是Session,CtxSession這兩個接口,其他 2 個接口是在插件中使用.
消息Message
消息Message包含消息頭Header, 消息體Body, 是客戶端與服務端之間通信的實體.
Message interface{}抽象了對通信實體的操作.
Size消息的長度
Transfer-Filter-Pipeline報文數據過濾處理管道
Seq序列號
MType消息類型
ServiceMethod資源標識符
Meta消息的元數據
BodyCodec消息體編碼格式
Body消息體
協議 Proto
協議是對消息Message對象的序列化和反向序列化,框架提供Proto接口。只需要實現該接口,開發者就能定制符合業務需求的自定義協議,從而提升了框架的靈活性.
接口的定義如下:
type Proto interface { Version() (byte, string) Pack(Message) error Unpack(Message) error}
Version()返回該協議的 id 和名字,兩個組成唯一的版本號.
Pack對消息Message對象進行序列化.
Unpack對字節流反序列化,生成一個消息Message對象.
目前框架已支持Http,Json,Raw,Protobuf,JsonRpc這 5 個協議.
RAW協議組成如下:
其他協議可以參考代碼.
編碼 Codec
作為一個通用性的框架,支持的協議可以有多種,消息體的編解碼也可以有多少種.drpc使用Codec接口對消息體 Body 進行編解碼.
接口的定義如下:
type Codec interface { ID() byte Name() string Marshal(interface{}) ([]byte, error) Unmarshal([]byte, interface{}) error }
ID返回編 Codec 的 id
Name返回編 Codec 的名字,名字是為了開發者更容易識別.
Marshal對消息內容進行編碼
Unmarshal對消息內容進行解碼
目前框架已支持Form,Json,plain,Protobuf,XML這 5 個編解碼.
連接 Socket
Socket擴展了net.Conn, 并且抽象出接口,方便框架對底層網絡協議的集成.
Socket接口實現了一部分Session接口的功能,Session接口調用的一些方法,實際上是轉發調用了Socket中的方法.
這樣的分層實現,讓Socket擁有的集成其他協議的能力.
TCP V4,TCP V6
Unix Socket
KCP
QUIC
支持對連接的性能調優.
SetKeepAlive開啟鏈接保活
SetKeepAlivePeriod鏈接保活間隔時間
SetReadBuffer設置鏈接讀緩沖區 size
SetWriteBuffer獲取鏈接寫緩沖區 size
SetNoDelay開啟關閉 no delay 算法
ControlFD支持操作鏈接的原始句柄
有機的組合
前面講到,DMicro框架萬物皆接口,分層 + 接口的設計,讓DMicro有了靈活的組成高效且符合業務實際情況的能力.
接下來我們要講到實現這些能力的基礎。插件系統.
插件 Plugin
插件系統給框架帶來了極大的擴展性和靈活性,是整個框架的一個靈魂模塊,有了它,框架就有了無限可能。
什么樣的插件系統才能算是優雅呢?我能想到的有以下幾點:
合理且豐富的hook位置,能夠覆蓋整個框架的生命周期,貫穿通訊的各個環節。
每個hook位置的入參和出參都是經過精心設計。
每個插件都能夠使用多個hook位置,每個hook位置都能被多個插件使用。
設計的足夠簡潔,優雅。能方便的進行二次開發定制。
在drpc中,鉤子貫穿與整個Endpoint的生命周期,是它不可或缺的重要一環。
通過這些鉤子 Hook點,賦予了插件無限可能.
組件
有了插件,就能通過插件的組合,編寫綜合功能的組件,目前框架提供一些內置的組件,
服務端 Rpc Server
客戶端 Rpc Client
服務注冊 Registry
服務發現 Selector
事件總線 EventBus
進程管理 Supervisor
即將提供:
鏈路追蹤 Tracing
統計告警 Metrics
限流熔斷 Broker.
限于篇幅的原因,具體組件的實現,這里就不深入講解,請關注后續的文章.
未來展望
如果把DMicro比作人生,現在成長的階段還處在少年時期,只完成了基礎的架構設計和一部分組件的開發.
接下來的方向主要是往易用性和可靠性方向發展.
易用性:
項目效能工具dmctl工具的開發,包括代碼生成,項目結構生成,打包,編譯等等功能.
符合 openapi 定義的文檔組件的開發.
更加完善的文檔和使用示例.
可靠性:
可觀測性
鏈路追蹤
指標信息
日志流
生產可用
測試用例的完善
代碼覆蓋率
性能調優
審核編輯:郭婷
-
接口
+關注
關注
33文章
8694瀏覽量
151929 -
封裝
+關注
關注
127文章
7997瀏覽量
143416
發布評論請先 登錄
相關推薦
評論