Go微服務開發(fā)框架DMicro設計思路詳解_第1頁
Go微服務開發(fā)框架DMicro設計思路詳解_第2頁
Go微服務開發(fā)框架DMicro設計思路詳解_第3頁
Go微服務開發(fā)框架DMicro設計思路詳解_第4頁
Go微服務開發(fā)框架DMicro設計思路詳解_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Go微服務開發(fā)框架DMicro設計思路詳解目錄背景概述架構設計理念面向接口設計會話Session消息Message協(xié)議Proto編碼Codec連接Socket有機的組合插件Plugin組件未來展望

背景

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

我們業(yè)務開發(fā)有幾個痛點,在當時golang的生態(tài)中無法找到一整套解決方案。

微服務應用和單體應用同時開發(fā)。高性能,高可用的網(wǎng)絡通訊。需要自定義應用層的協(xié)議(重點)。需要靈活的插件擴展機制,方便適配現(xiàn)有系統(tǒng)(重點)。服務端與客戶端的概念模糊,互相都能使用相同的api調用對方。支持Push消息。連接/會話管理。高效率的開發(fā),支持通過proto生成代碼。支持多種網(wǎng)絡協(xié)議,tcp,websocket,quic,unixsocket.兼容http協(xié)議。能夠更快速的定位問題。更便捷的增加新特性。

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

概述

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

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

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

DRpc特性列表:

對等通信,對等Api高性能,非阻塞異步IO自定義Proto,,兼容http協(xié)議,自定義CodecHook點,插件系統(tǒng),Push消息,session管理,Socket抽象,斷線重連,過載保護,負載均衡,心跳機制,平滑重啟...

DServer特性列表:

快速構建,平滑重啟,多進程支持,單/多進程一致預定義命令行,ctrl命令管理服務可觀測,可控制,應用沙盒

DMicro已經(jīng)內置組件:

[x]Registry服務注冊[x]Selector服務發(fā)現(xiàn)[x]Eventbus事件總線[x]Supervisor進程管理[]Codegen代碼生成[]Tracing鏈路追蹤[]Metrics統(tǒng)計告警[]Broker限流熔斷[]OpenAPI文檔自動生成

架構

設計理念

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

面向接口設計,保證代碼穩(wěn)定,提供靈活定制。抽象各組件的接口,高內聚,低耦合。分層設計,自上而下逐層封裝,利于穩(wěn)定和維護。高性能,高可用,低消耗。對開發(fā)友好,封裝復雜度。提供豐富的組件及功能,讓開發(fā)專注業(yè)務。

無數(shù)個寫DMicro的日夜,我都謹記開發(fā)三原則:

Clarity(清晰)Simplicity(簡單)Productivity(生產(chǎn)力)

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

面向接口設計

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

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

會話Session

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

Endpoint融合了Client和Server,需要提供相同的Api.服務端需要主動向客戶端發(fā)送消息,并且獲取客戶端的響應.服務端支持對多個客戶端批量發(fā)送消息.異步主動斷開一個或多個會話.獲取會話底層的文件描述符,對其進行性能調優(yōu).可以為每個會話綁定特殊的數(shù)據(jù)/屬性.

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

獲取連接信息控制連接的生命周期(超時時間)控制單次請求的生命周期(超時時間)接收消息發(fā)送消息創(chuàng)建消息的上下文綁定會話的相關信息(如用戶信息)斷線重連主動斷開會話.健康檢查獲取連接關閉事件為會話設置單獨的id

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

EarlySession表示剛生成會話,尚未啟動goroutine讀取數(shù)據(jù)的階段.BaseSession只有最基礎的方法,用于關閉連接時候的插件參數(shù).CtxSession在處理程序上下文中傳遞的會話對象.Session全功能的會話對象.

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

消息Message

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

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

Size消息的長度Transfer-Filter-Pipeline報文數(shù)據(jù)過濾處理管道Seq序列號MType消息類型ServiceMethod資源標識符Meta消息的元數(shù)據(jù)BodyCodec消息體編碼格式Body消息體

協(xié)議Proto

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

接口的定義如下:

typeProtointerface{

Version()(byte,string)

Pack(Message)error

Unpack(Message)error

}

Version()返回該協(xié)議的id和名字,兩個組成唯一的版本號.Pack對消息Message對象進行序列化.Unpack對字節(jié)流反序列化,生成一個消息Message對象.

目前框架已支持Http,Json,Raw,Protobuf,JsonRpc這5個協(xié)議.

RAW協(xié)議組成如下:

其他協(xié)議可以參考代碼.

編碼Codec

作為一個通用性的框架,支持的協(xié)議可以有多種,消息體的編解碼也可以有多少種.drpc使用Codec接口對消息體Body進行編解碼.

接口的定義如下:

typeCodecinterface{

ID()byte

Name()string

Marshal(interface{})([]byte,error)

Unmarshal([]byte,interface{})error

}

ID返回編Codec的idName返回編Codec的名字,名字是為了開發(fā)者更容易識別.Marshal對消息內容進行編碼Unmarshal對消息內容進行解碼

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

連接Socket

Socket擴展了net.Conn,并且抽象出接口,方便框架對底層網(wǎng)絡協(xié)議的集成.

Socket接口實現(xiàn)了一部分Session接口的功能,Session接口調用的一些方法,實際上是轉發(fā)調用了Socket中的方法.

這樣的分層實現(xiàn),讓Socket擁有的集成其他協(xié)議的能力.

TCPV4,TCPV6UnixSocketKCPQUIC

支持對連接的性能調優(yōu).

SetKeepAlive開啟鏈接?;頢etKeepAlivePeriod鏈接?;铋g隔時間SetReadBuffer設置鏈接讀緩沖區(qū)sizeSetWriteBuffer獲取鏈接寫緩沖區(qū)sizeSetNoDelay開啟關閉nodelay算法ControlFD支持操作鏈接的原始句柄

有機的組合

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

接下來我們要講到實現(xiàn)這些能力的基礎。插件系統(tǒng).

插件Plugin

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

什么樣的插件系統(tǒng)才能算是優(yōu)雅呢?我能想到的有以下幾點:

合理且豐富的hook位置,能夠覆蓋整個框架的生命周期,貫穿通訊的各個環(huán)節(jié)。每個hook位置的入?yún)⒑统鰠⒍际墙?jīng)過精心設計。每個插件都能夠使用多個hook位置,每個hook位置都能被多個插件使用。設計的足夠簡潔,優(yōu)雅。能方便的進行二次開發(fā)定制。

在drpc中,鉤子貫穿與整個Endpoint的生命周期,是它不可或缺的重要一環(huán)。

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

組件

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

服務端RpcServer客戶端RpcClient服務注冊Registry服務發(fā)現(xiàn)Selector事件總線EventBus進程管理Supervisor

即將提供:

鏈路追蹤Tracing統(tǒng)計告警Metrics限流熔斷Broker.

限于篇幅的原因,具體組件的實現(xiàn),這里就不深入講解,請關注后續(xù)的文章.

未來展望

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

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

易用性:

項目效能工具dmctl工具的開發(fā),包括代碼生成,項目結構生成,打包,編譯等等功能.符合openapi定義的文檔組件的開發(fā).更加完善的文檔和使用示例.

可靠性:

可觀測性

鏈路追

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論