MASA Framework – 整體設計思路
源起
年初我們在找一款框架,希望它有如下幾個特點:
-
學習成本低
只需要學.Net每年主推的技術棧和業務特性必須支援的中間件,給開發同學減負,只需要專註業務就好
個人見解:一款好用的框架應該是補充,而不是顛覆或過度創新
-
對擴展開放
可以按照業務需求任意調整依賴實現,而不被捆綁在一個架構思路上
-
功能強大卻不限制架構,從單體到SOA再到微服務都可以適應
因為一個系統中總有複雜的也有簡單的,最好能全面覆蓋我們的業務場景
-
行業不限
既能支援傳統行業的業務特殊性,又可以支援互聯網行業的高並發特性
-
穩定性
有嚴格的測試標準,用起來更安心
契機
在我們做技術選型的時候,對Dapr的研究越深入,對我們想要做的事情就越清晰
站在Dapr的設計上我們找到了一個平衡點,Mecha
可以看下這篇文章(Mecha:將Mesh進行到底)://skyao.io/talk/202004-mecha-mesh-through-to-the-end/
Mecha的特性
- Mecha是通用的,高度可配置的,可重用的組件,提供分散式原語作為現成的能力
- Mecha 可以與單個Micrologic組件一起部署(Sidecar模式),也可以部署為多個共享(註:我稱之為Node模式)
- Mecha不對Micrologic運行時做任何假設。它與使用開放協議和格式(例如HTTP/gRPC,JSON,Protobuf,CloudEvents)的多語言微服務甚至單體一起使用
- Mecha以簡單的文本格式(例如YAML,JSON)聲明式地配置,指示要啟用的功能以及如何將其綁定到Micrologic端點
- 與其依靠多個代理來實現不同的目的(例如網路代理,快取代理,綁定代理),不如使用一個Mecha提供所有這些能力
換個角度看Mecha
-
Mecha提供的是能力,不論是單體還是分散式
-
Mecha與服務之間交互是有開放API標準的
-
Mecha可以通過文本格式(Yaml或Json)聲明式地配置
對於.Net開發來說,更習慣用Json
-
應用需要多種多樣的能力,Mecha提供了一整套解決方案卻不強綁定你所有都要用到,按需即可
-
每個能力有不同的實現版本,可以根據自身業務情況替換其中某一部分的能力
為什麼是Mecha
Mecha的好處是業務邏輯和越來越多的分散式系統問題之間的松耦合,除了可以解決分散式以外,我們是否也可以延展成業務邏輯和架構之間的松耦合?
當然,說到底就是dll而已
在分散式架構中,它以Sidecar的形式守護在應用身旁。
如果在.Net項目中,它是否可以類似.Net Framework作為基建/適配器/中間件/匯流排等身份駐留在.Net進程中提供基礎能力?
設計思路
一個完整的設計要先從概念開始,為了降低學習成本我們直接復用Dapr的概念定義
概念
構建塊
提供介面標準,並為了達到某個基礎能力的串接不同組件(也通過介面),松耦合但不脫鉤
組件
基於介面標準的實現,比如服務間通訊提供HttpClient和Dapr Service Invocation等不同組件的實現
工具庫
提供更抽象的底層能力,供業務和組件完成自身功能,如快取/配置/數據操作/安全等
Roadmap – v1.0
- 基於.Net主推技術棧,不魔改,降低學習成本
- 提供項目模板,根據業務需求自由組合功能集合
- 支援單體架構,也支援分散式架構
- 支援DDD方法論,也支援CQRS
- 盡量小的依賴集合,但不為了小而小
- 約定優於配置
- 有創新,且要經過生產驗證
目前進展
我們首先完成了用於指導架構相關的部分,如DDD、CQRS、Minimal APIs擴展等,並保持單元測試覆蓋率在90%以上,目前93%。
以Contrib的目錄結構為例:
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、事務控制、Event和Hanlder解耦模式。相較於MediatR性能僅有0.x%的差距但功能更加強大,可以面對更複雜的業務場景,並且已規劃性能優化路線
- Integration Event Bus是Event Bus的增強版,支援分散式事務(最終一致性),與Dapr集成
- Domain Event Bus是Event Bus和Integration Event Bus的集成版,支援在領域內自動控制進程內與進程外的事件,支援實時發送也支援入棧後統一發送
更多功能等你來體驗,也歡迎提意見
什麼是MASA
MASA = Mesh Application Service Architecture,即網格應用服務架構
除了MASA Framework,我們馬上將開源Blazor組件庫(MASA Blazor),包括管理後台模板(MASA Blazor Pro)
後續還有MASA Stack開源產品,基於MASA Framework打造的一站式PaaS平台,具備DevOps、微服務觀測治理、數據治理等平台級能力
示例 – MASA.EShop
MASA.EShop是使用MASA.Framework復刻了eShopOnDapr的功能,並提供了多種架構方式的示例。
- 支援Docker Compose
- dapr component配置
- Blazor版EShop網站(正在籌備更換為MASA Blazor Pro的UI)
- 共享Contracts
- 所有服務都使用Minimal APIs和Dapr Pub/Sub進行通訊
- MASA.EShop.Services.Basket演示單體架構,使用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://github.com/masastack/MASA.BuildingBlocks
MASA.Contrib://github.com/masastack/MASA.Contrib
MASA.Utils://github.com/masastack/MASA.Utils
MASA.EShop://github.com/masalabs/MASA.EShop