源起
年初我們在找一款框架,希望它有如下幾個特點:
-
學習成本低
只需要學.Net每年主推的技術棧和業務特性必須支援的中介軟體,給開發同學減負,只需要專注業務就好
個人見解:一款好用的框架應該是補充,而不是顛覆或過度創新
-
對擴充套件開放
可以按照業務需求任意調整依賴實現,而不被捆綁在一個架構思路上
-
功能強大卻不限制架構,從單體到SOA再到微服務都可以適應
因為一個系統中總有複雜的也有簡單的,最好能全面覆蓋我們的業務場景
-
行業不限
既能支援傳統行業的業務特殊性,又可以支援網際網路行業的高併發特性
-
穩定性
有嚴格的測試標準,用起來更安心
契機
在我們做技術選型的時候,對Dapr的研究越深入,對我們想要做的事情就越清晰
站在Dapr的設計上我們找到了一個平衡點,Mecha
可以看下這篇文章(Mecha:將Mesh進行到底):https://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: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