写点什么

MASA Framework - 整体设计思路

  • 2022 年 1 月 12 日
  • 本文字数:3115 字

    阅读完需:约 10 分钟

源起

年初我们在找一款框架,希望它有如下几个特点:


  1. 学习成本低

  2. 只需要学.Net 每年主推的技术栈和业务特性必须支持的中间件,给开发同学减负,只需要专注业务就好

    个人见解:一款好用的框架应该是补充,而不是颠覆或过度创新

  3. 对扩展开放

  4. 可以按照业务需求任意调整依赖实现,而不被捆绑在一个架构思路上

  5. 功能强大却不限制架构,从单体到 SOA 再到微服务都可以适应

  6. 因为一个系统中总有复杂的也有简单的,最好能全面覆盖我们的业务场景

  7. 行业不限

  8. 既能支持传统行业的业务特殊性,又可以支持互联网行业的高并发特性

  9. 稳定性

  10. 有严格的测试标准,用起来更安心

契机

在我们做技术选型的时候,对 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)声明式地配置

  4. 对于.Net 开发来说,更习惯用 Json

  5. 应用需要多种多样的能力,Mecha 提供了一整套解决方案却不强绑定你所有都要用到,按需即可

  6. 每个能力有不同的实现版本,可以根据自身业务情况替换其中某一部分的能力

为什么是 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


如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们


参考

  • https://skyao.io/talk/202004-mecha-mesh-through-to-the-end/

发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2021.10.26 加入

还未添加个人简介

评论

发布
暂无评论
MASA Framework - 整体设计思路