Go 每日一庫之微服務開發框架 DMicro 的設計思路

來源 | OSCHINA 社區

作者 | ClownFish

原文鏈接:https://my.oschina.net/clownfish/blog/5560923

DMicro 源碼地址:

背景

DMicro 誕生的背景,是因爲我寫了 10 來年的 PHP,想在公司內部推廣 Go, 公司內部的組件及 rpc 協議都是基於 swoole 定製化開發的。調研了市面上的各種框架,包括 beego,goframe,gin,go-micro,go-zero,erpc 等等,可能是我當時技術能力有限,並不能讓這些框架很好的適配我們的業務。

我們業務開發有幾個痛點,在當時 golang 的生態中無法找到一整套解決方案。

在對常用的開源框架做了簡單的調研以後,發現並沒有一款合適的框架能滿足我的所有需求。在認真思考過後,發現 erpc 和 goframe 兩個框架的結合體能滿足我的需求,於是就誕生了自研 DMicro.

概述

DMicro 中的 drpc 組件的思想是參考 erpc 實現,甚至可以說是它的繼承者。

drpc 組件是 DMicro 框架的一部分,爲了適配 DMicro 框架,在 erpc 的基礎上做了深入的擴展開發。

整個 DMicro 大量使用 goframe 中的組件,如果業務使用 goframe 框架,可以無縫接入。

DRpc 特性列表:

DServer 特性列表:

DMicro 已經內置組件:

架構

設計理念

對 DMicro 框架的設計,從設計之初就是在追求靈活性,適應性。在保證微服務的穩定性前提下,追求項目的開發效率。

無數個寫 DMicro 的日夜,我都謹記開發三原則:

無論工作,還是做開源項目,都應該保持這三個原則,養成良好的習慣。

面向接口設計

DMicro 秉承着萬物皆接口的原則,提供框架無與倫比的擴展性.

下圖展示的是消息的發送的流轉流程,可以看到,所有的功能點都被抽象成了接口,每個功能點都提供了不同的實現.

會話 Session

大多數的 Rpc 框架並不強調會話 (session) 的概念,因其應用場景不需要用到會話 (session). 那麼 drpc 爲什麼需要抽象出會話 (session) 呢?

Session 抽象了整個 drpc 框架的會話,把 Socket,Message,Context 都融合到一起。開發者只需要對 session 進行操作,就能實現大多數需求.

Session 接口可以細分爲 4 個 interface{}, 分別是 EarlySession,BaseSession,CtxSession,Session. 對應的是應用的不同生命階段會話 (Session) 擁有的不同屬性.

正常情況下,開發者用到的都是 Session,CtxSession 這兩個接口,其他 2 個接口是在插件中使用.

消息 Message

消息 Message 包含消息頭 Header, 消息體 Body, 是客戶端與服務端之間通信的實體.

Message interface{} 抽象了對通信實體的操作.

協議 Proto

協議是對消息Message 對象的序列化和反向序列化,框架提供 Proto 接口。只需要實現該接口,開發者就能定製符合業務需求的自定義協議,從而提升了框架的靈活性.

接口的定義如下:

type Proto interface {
	Version() (byte, string)
	Pack(Message) error
	Unpack(Message) error}

目前框架已支持 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
}

目前框架已支持 Form,Json,plain,Protobuf,XML 這 5 個編解碼.

連接 Socket

Socket 擴展了 net.Conn, 並且抽象出接口,方便框架對底層網絡協議的集成.

Socket 接口實現了一部分 Session 接口的功能,Session 接口調用的一些方法,實際上是轉發調用了 Socket 中的方法.

這樣的分層實現,讓 Socket 擁有的集成其他協議的能力.

支持對連接的性能調優.

有機的組合

前面講到,DMicro 框架萬物皆接口,分層 + 接口的設計,讓 DMicro 有了靈活的組成高效且符合業務實際情況的能力.

接下來我們要講到實現這些能力的基礎。插件系統.

插件 Plugin

插件系統給框架帶來了極大的擴展性和靈活性,是整個框架的一個靈魂模塊,有了它,框架就有了無限可能。

什麼樣的插件系統才能算是優雅呢?我能想到的有以下幾點:

在 drpc 中,鉤子貫穿與整個 Endpoint 的生命週期,是它不可或缺的重要一環。

 通過這些鉤子 Hook 點,賦予了插件無限可能.

組件

有了插件,就能通過插件的組合,編寫綜合功能的組件,目前框架提供一些內置的組件,

即將提供:

限於篇幅的原因,具體組件的實現,這裏就不深入講解,請關注後續的文章.

未來展望

如果把 DMicro 比作人生,現在成長的階段還處在少年時期,只完成了基礎的架構設計和一部分組件的開發.

接下來的方向主要是往易用性和可靠性方向發展.

易用性:

可靠性:

希望 DMicro 能在大家的呵護及鞭策下茁長成長.

開源不易,需要更多小夥伴加入,共創 DMicro. 如果你希望使用 DMicro, 趕快引入代碼,搭建你的第一個新項目吧!如果你也想爲 DMicro 生態添磚加瓦,趕快 Fork 代碼,給我們提交 pr 吧!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/sGwf1NUX3UpKmMniKtwa7g