MASA Framework - 整體設計思路

MASA技術團隊發表於2022-01-11

源起

年初我們在找一款框架,希望它有如下幾個特點:

  1. 學習成本低

    只需要學.Net每年主推的技術棧和業務特性必須支援的中介軟體,給開發同學減負,只需要專注業務就好

    個人見解:一款好用的框架應該是補充,而不是顛覆或過度創新

  2. 對擴充套件開放

    可以按照業務需求任意調整依賴實現,而不被捆綁在一個架構思路上

  3. 功能強大卻不限制架構,從單體到SOA再到微服務都可以適應

    因為一個系統中總有複雜的也有簡單的,最好能全面覆蓋我們的業務場景

  4. 行業不限

    既能支援傳統行業的業務特殊性,又可以支援網際網路行業的高併發特性

  5. 穩定性

    有嚴格的測試標準,用起來更安心

契機

在我們做技術選型的時候,對Dapr的研究越深入,對我們想要做的事情就越清晰

站在Dapr的設計上我們找到了一個平衡點,Mecha

可以看下這篇文章(Mecha:將Mesh進行到底):https://skyao.io/talk/202004-mecha-mesh-through-to-the-end/

Mecha的特性

  1. Mecha是通用的,高度可配置的,可重用的元件,提供分散式原語作為現成的能力
  2. Mecha 可以與單個Micrologic元件一起部署(Sidecar模式),也可以部署為多個共享(注:我稱之為Node模式)
  3. Mecha不對Micrologic執行時做任何假設。它與使用開放協議和格式(例如HTTP/gRPC,JSON,Protobuf,CloudEvents)的多語言微服務甚至單體一起使用
  4. Mecha以簡單的文字格式(例如YAML,JSON)宣告式地配置,指示要啟用的功能以及如何將其繫結到Micrologic端點
  5. 與其依靠多個代理來實現不同的目的(例如網路代理,快取代理,繫結代理),不如使用一個Mecha提供所有這些能力

換個角度看Mecha

  1. Mecha提供的是能力,不論是單體還是分散式

  2. Mecha與服務之間互動是有開放API標準的

  3. Mecha可以通過文字格式(Yaml或Json)宣告式地配置

    對於.Net開發來說,更習慣用Json

  4. 應用需要多種多樣的能力,Mecha提供了一整套解決方案卻不強繫結你所有都要用到,按需即可

  5. 每個能力有不同的實現版本,可以根據自身業務情況替換其中某一部分的能力

為什麼是Mecha

Mecha的好處是業務邏輯和越來越多的分散式系統問題之間的鬆耦合,除了可以解決分散式以外,我們是否也可以延展成業務邏輯和架構之間的鬆耦合?

當然,說到底就是dll而已

coupling-in-different-architectures_hu05f2d69ba0319c258f11ab39e179ac17_281537_1200x1200_fit_q75_lanczos.jpg

在分散式架構中,它以Sidecar的形式守護在應用身旁。

如果在.Net專案中,它是否可以類似.Net Framework作為基建/介面卡/中介軟體/匯流排等身份駐留在.Net程式中提供基礎能力?

設計思路

一個完整的設計要先從概念開始,為了降低學習成本我們直接複用Dapr的概念定義

概念

構建塊

提供介面標準,併為了達到某個基礎能力的串接不同元件(也通過介面),鬆耦合但不脫鉤

元件

基於介面標準的實現,比如服務間通訊提供HttpClient和Dapr Service Invocation等不同元件的實現

工具庫

提供更抽象的底層能力,供業務和元件完成自身功能,如快取/配置/資料操作/安全等

Roadmap - v1.0

  • 基於.Net主推技術棧,不魔改,降低學習成本
  • 提供專案模板,根據業務需求自由組合功能集合
  • 支援單體架構,也支援分散式架構
  • 支援DDD方法論,也支援CQRS
  • 儘量小的依賴集合,但不為了小而小
  • 約定優於配置
  • 有創新,且要經過生產驗證

MASA.Framework.png

目前進展

我們首先完成了用於指導架構相關的部分,如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、充血模型

eshop.png

開源地址

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

相關文章