MASA Framework - 整体设计思路
源起
年初我們?cè)谡乙豢羁蚣?#xff0c;希望它有如下幾個(gè)特點(diǎn):
學(xué)習(xí)成本低
只需要學(xué).Net每年主推的技術(shù)棧和業(yè)務(wù)特性必須支持的中間件,給開發(fā)同學(xué)減負(fù),只需要專注業(yè)務(wù)就好
個(gè)人見解:一款好用的框架應(yīng)該是補(bǔ)充,而不是顛覆或過度創(chuàng)新
對(duì)擴(kuò)展開放
可以按照業(yè)務(wù)需求任意調(diào)整依賴實(shí)現(xiàn),而不被捆綁在一個(gè)架構(gòu)思路上
功能強(qiáng)大卻不限制架構(gòu),從單體到SOA再到微服務(wù)都可以適應(yīng)
因?yàn)橐粋€(gè)系統(tǒng)中總有復(fù)雜的也有簡(jiǎn)單的,最好能全面覆蓋我們的業(yè)務(wù)場(chǎng)景
行業(yè)不限
既能支持傳統(tǒng)行業(yè)的業(yè)務(wù)特殊性,又可以支持互聯(lián)網(wǎng)行業(yè)的高并發(fā)特性
穩(wěn)定性
有嚴(yán)格的測(cè)試標(biāo)準(zhǔn),用起來更安心
契機(jī)
在我們做技術(shù)選型的時(shí)候,對(duì)Dapr的研究越深入,對(duì)我們想要做的事情就越清晰
站在Dapr的設(shè)計(jì)上我們找到了一個(gè)平衡點(diǎn),Mecha
可以看下這篇文章(Mecha:將Mesh進(jìn)行到底):https://skyao.io/talk/202004-mecha-mesh-through-to-the-end/
Mecha的特性
Mecha是通用的,高度可配置的,可重用的組件,提供分布式原語作為現(xiàn)成的能力
Mecha 可以與單個(gè)Micrologic組件一起部署(Sidecar模式),也可以部署為多個(gè)共享(注:我稱之為Node模式)
Mecha不對(duì)Micrologic運(yùn)行時(shí)做任何假設(shè)。它與使用開放協(xié)議和格式(例如HTTP/gRPC,JSON,Protobuf,CloudEvents)的多語言微服務(wù)甚至單體一起使用
Mecha以簡(jiǎn)單的文本格式(例如YAML,JSON)聲明式地配置,指示要啟用的功能以及如何將其綁定到Micrologic端點(diǎn)
與其依靠多個(gè)代理來實(shí)現(xiàn)不同的目的(例如網(wǎng)絡(luò)代理,緩存代理,綁定代理),不如使用一個(gè)Mecha提供所有這些能力
換個(gè)角度看Mecha
Mecha提供的是能力,不論是單體還是分布式
Mecha與服務(wù)之間交互是有開放API標(biāo)準(zhǔn)的
Mecha可以通過文本格式(Yaml或Json)聲明式地配置
對(duì)于.Net開發(fā)來說,更習(xí)慣用Json
應(yīng)用需要多種多樣的能力,Mecha提供了一整套解決方案卻不強(qiáng)綁定你所有都要用到,按需即可
每個(gè)能力有不同的實(shí)現(xiàn)版本,可以根據(jù)自身業(yè)務(wù)情況替換其中某一部分的能力
為什么是Mecha
Mecha的好處是業(yè)務(wù)邏輯和越來越多的分布式系統(tǒng)問題之間的松耦合,除了可以解決分布式以外,我們是否也可以延展成業(yè)務(wù)邏輯和架構(gòu)之間的松耦合?
當(dāng)然,說到底就是dll而已
在分布式架構(gòu)中,它以Sidecar的形式守護(hù)在應(yīng)用身旁。
如果在.Net項(xiàng)目中,它是否可以類似.Net Framework作為基建/適配器/中間件/總線等身份駐留在.Net進(jìn)程中提供基礎(chǔ)能力?
設(shè)計(jì)思路
一個(gè)完整的設(shè)計(jì)要先從概念開始,為了降低學(xué)習(xí)成本我們直接復(fù)用Dapr的概念定義
概念
構(gòu)建塊
提供接口標(biāo)準(zhǔn),并為了達(dá)到某個(gè)基礎(chǔ)能力的串接不同組件(也通過接口),松耦合但不脫鉤
組件
基于接口標(biāo)準(zhǔn)的實(shí)現(xiàn),比如服務(wù)間通訊提供HttpClient和Dapr Service Invocation等不同組件的實(shí)現(xiàn)
工具庫(kù)
提供更抽象的底層能力,供業(yè)務(wù)和組件完成自身功能,如緩存/配置/數(shù)據(jù)操作/安全等
Roadmap - v1.0
基于.Net主推技術(shù)棧,不魔改,降低學(xué)習(xí)成本
提供項(xiàng)目模板,根據(jù)業(yè)務(wù)需求自由組合功能集合
支持單體架構(gòu),也支持分布式架構(gòu)
支持DDD方法論,也支持CQRS
盡量小的依賴集合,但不為了小而小
約定優(yōu)于配置
有創(chuàng)新,且要經(jīng)過生產(chǎn)驗(yàn)證
目前進(jìn)展
我們首先完成了用于指導(dǎo)架構(gòu)相關(guān)的部分,如DDD、CQRS、Minimal APIs擴(kuò)展等,并保持單元測(cè)試覆蓋率在90%以上,目前93%。
以Contrib的目錄結(jié)構(gòu)為例:
MASA.Contrib ├── solution items │ ? ├── nuget.config ├── src │ ? ├── BasicAbility │ ? │ ? ├── MASA.Contrib.BasicAbility.Dcc ? ? ? ? ? ? ? ? ? ? ? ? Configuration API │ ? ├── Configuration │ ? │ ? ├── MASA.Contrib.Configuration │ ? ├── Data │ ? │ ? ├── MASA.Contrib.Data.UoW.EF ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Unit of work │ ? │ ? └── MASA.Contrib.Data.Contracts.EF ? ? ? ? ? ? ? ? ? ? ? ? Protocol EF version │ ? ├── DDD │ ? │ ? ├── MASA.Contrib.DDD.Domain ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? In-process and cross-process support │ ? │ ? └── MASA.Contrib.DDD.Domain.Repository.EF │ ? ├── Dispatcher │ ? │ ? ├── MASA.Contrib.Dispatcher.Events ? ? ? ? ? ? ? ? ? ? ? ? In-process event │ ? │ ? ├── MASA.Contrib.Dispatcher.IntegrationEvents.Dapr │ ? │ ? └── MASA.Contrib.Dispatcher.IntegrationEvents.EventLogs.EF Cross-process event │ ? ├── ReadWriteSpliting │ ? │ ? └── CQRS │ ? │ ? │ ? └── MASA.Contrib.ReadWriteSpliting.CQRS ? ? ? ? ? ? ? CQRS │ ? ├── Service │ ? │ ? └── MASA.Contrib.Service.MinimalAPIs ? ? ? ? ? ? ? ? ? ? ? Best practices for [MinimalAPI] ├── test │ ? ├── MASA.Contrib.Dispatcher.Events │ ? │ ? ├── MASA.Contrib.Dispatcher.Events.BenchmarkDotnetTest │ ? │ ? ├── MASA.Contrib.Dispatcher.Events.CheckMethodsParameter.Tests │ ? │ ? ├── MASA.Contrib.Dispatcher.Events.CheckMethodsParameterNotNull.Tests │ ? │ ? ├── MASA.Contrib.Dispatcher.Events.CheckMethodsParameterType.Tests │ ? │ ? ├── MASA.Contrib.Dispatcher.Events.CheckMethodsType.Tests │ ? │ ? ├── MASA.Contrib.Dispatcher.Events.OnlyCancelHandler.Tests │ ? │ ? ├── MASA.Contrib.Dispatcher.Events.CheckMethodsType.Tests │ ? │ ? ├── MASA.Contrib.Dispatcher.Events.Tests │ ? ├── MASA.Contrib.Data.UoW.EF.Tests │ ? ├── MASA.Contrib.Dispatcher.IntegrationEvents.EventLogs.EF.Tests │ ? ├── MASA.Contrib.DDD.Domain.Tests │ ? ├── MASA.Contrib.DDD.Domain.Repository.EF.Tests有什么新功能
Minimal APIs支持類似Controller的API分類聚合
Event Bus支持Hanlder編排、SAGA、Middleware、事務(wù)控制、Event和Hanlder解耦模式。相較于MediatR性能僅有0.x%的差距但功能更加強(qiáng)大,可以面對(duì)更復(fù)雜的業(yè)務(wù)場(chǎng)景,并且已規(guī)劃性能優(yōu)化路線
Integration Event Bus是Event Bus的增強(qiáng)版,支持分布式事務(wù)(最終一致性),與Dapr集成
Domain Event Bus是Event Bus和Integration Event Bus的集成版,支持在領(lǐng)域內(nèi)自動(dòng)控制進(jìn)程內(nèi)與進(jìn)程外的事件,支持實(shí)時(shí)發(fā)送也支持入棧后統(tǒng)一發(fā)送
更多功能等你來體驗(yàn),也歡迎提意見
什么是MASA
MASA = Mesh Application Service Architecture,即網(wǎng)格應(yīng)用服務(wù)架構(gòu)
除了MASA Framework,我們馬上將開源Blazor組件庫(kù)(MASA Blazor),包括管理后臺(tái)模板(MASA Blazor Pro)
后續(xù)還有MASA Stack開源產(chǎn)品,基于MASA Framework打造的一站式PaaS平臺(tái),具備DevOps、微服務(wù)觀測(cè)治理、數(shù)據(jù)治理等平臺(tái)級(jí)能力
示例 - MASA.EShop
MASA.EShop是使用MASA.Framework復(fù)刻了eShopOnDapr的功能,并提供了多種架構(gòu)方式的示例。
支持Docker Compose
dapr component配置
Blazor版EShop網(wǎng)站(正在籌備更換為MASA Blazor Pro的UI)
共享Contracts
所有服務(wù)都使用Minimal APIs和Dapr Pub/Sub進(jìn)行通信
MASA.EShop.Services.Basket演示單體架構(gòu),使用Dapr State Management
MASA.EShop.Services.Catalog演示CQRS,使用CQRS、貧血模型
MASA.EShop.Services.Ordering演示CQRS與Actor,使用CQRS、貧血模型、Dapr Actor
MASA.EShop.Service.Payment演示CQRS與DDD,使用CQRS、DDD、充血模型
開源地址
MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks
MASA.Contrib:https://github.com/masastack/MASA.Contrib
MASA.Utils:https://github.com/masastack/MASA.Utils
MASA.EShop:https://github.com/masalabs/MASA.EShop
如果你對(duì)我們的MASA Framework感興趣,無論是代碼貢獻(xiàn)、使用、提Issue,歡迎聯(lián)系我們
參考
https://skyao.io/talk/202004-mecha-mesh-through-to-the-end/
總結(jié)
以上是生活随笔為你收集整理的MASA Framework - 整体设计思路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2分钟,我把网站性能优化了3倍!
- 下一篇: Kubernetes:实现应用不停机更新