源起

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

  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而已

在分布式架构中,它以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 - 整体设计思路的更多相关文章

  1. MASA Framework - EventBus设计

    目录 MASA Framework - 整体设计思路 MASA Framework - EventBus设计 概述 利用发布订阅模式来解耦不同架构层级,亦可用于解决隔离业务之间的交互 优点: 松耦合 ...

  2. MASA Framework - DDD设计(1)

    目录 MASA Framework - 整体设计思路 MASA Framework - EventBus设计 MASA Framework - MASA Framework - DDD设计(1) DD ...

  3. MASA Framework - DDD设计(2)

    目录 MASA Framework - 整体设计思路 MASA Framework - EventBus设计 MASA Framework - MASA Framework - DDD设计(1) MA ...

  4. legend2---开发日志1(legend的数据库整体设计思路是什么)

    legend2---开发日志1(legend的数据库整体设计思路是什么) 一.总结 一句话总结:不同种类的物品分不同的表放,不放到一个物品表里,取所有物品时一个个表的取就好了 不同种类的物品分不同的表 ...

  5. [三]JavaIO之IO体系类整体设计思路 流的概念以及四大基础分类

    从本文开始,将正式进入JavaIO的简介 在继续javaIO系列的文章之前 可以过去看一下 本人博客上的设计模式中的 适配器模式和装饰器模式 这会对接下来的阅读大有帮助   本文是从逻辑上介绍整个的J ...

  6. ibatis源码学习1_整体设计和核心流程

    背景介绍ibatis实现之前,先来看一段jdbc代码: Class.forName("com.mysql.jdbc.Driver"); String url = "jdb ...

  7. MASA Auth - 从用户的角度看整体设计

    用户 在系统里,用户是一个核心概念.它代表了一个人的唯一身份标识,除了与角色.团队.组织架构等有关,甚至还会影响到在同一个界面不同的用户操作流程与显示内容都会发生变化,再复杂一点的话,或许在同一个系统 ...

  8. 万字详解TDengine 2.0整体架构设计思路

    ​导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...

  9. MASA Framework -- EventBus入门与设计

    概述 事件总线是一种事件发布/订阅结构,通过发布订阅模式可以解耦不同架构层级,同样它也可以来解决业务之间的耦合,它有以下优点 松耦合 横切关注点 可测试性 事件驱动 发布订阅模式 通过下图我们可以快速 ...

随机推荐

  1. <转>libevent使用demo

    这篇文章介绍下libevent在socket异步编程中的应用.在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的 ...

  2. More Effective C++ 基础议题(条款1-4)总结

    More Effective C++ 基础议题(条款1-4)总结 条款1:仔细区别pointers和references 如果有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能它不指向(代表 ...

  3. Linux使用docker安装zimg图片服务器

    官方地址:http://zimg.buaa.us/ 配置文件 zimg.lua --zimg server config --server config --是否后台运行 is_daemon = 1 ...

  4. 再谈多线程模型之生产者消费者(总结)(c++11实现)

    0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...

  5. 【LeetCode】1128. Number of Equivalent Domino Pairs 等价多米诺骨牌对的数量(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计 代码 复杂度分析 日期 题目地址:http ...

  6. 【LeetCode】87. Scramble String 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 动态规划 日期 题目地址:https://le ...

  7. 【LeetCode】845. Longest Mountain in Array 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双数组 参考资料 日期 题目地址:https://l ...

  8. 【LeetCode】16. 3Sum Closest 最接近的三数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, three sum, 三数之和,题解,lee ...

  9. 【LeetCode】606. Construct String from Binary Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 日期 题目地址:https://l ...

  10. 【LeetCode】200. Number of Islands 岛屿数量

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...