MASA Framework - 整体设计思路
源起
年初我们在找一款框架,希望它有如下几个特点:
-
学习成本低
只需要学.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
如果你对我们的MASA Framework感兴趣,无论是代码贡献、使用、提Issue,欢迎联系我们
参考

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
不会一致性hash算法,劝你简历别写搞过负载均衡
大家好,我是小富~ 个人公众号:程序员内点事,欢迎学习交流 这两天看到技术群里,有小伙伴在讨论一致性hash算法的问题,正愁没啥写的题目就来了,那就简单介绍下它的原理。下边我们以分布式缓存中经典场景举例,面试中也是经常提及的一些话题,看看什么是一致性hash算法以及它有那些过人之处。 构建场景 假如我们有三台缓存服务器编号node0、node1、node2,现在有3000万个key,希望可以将这些个key均匀的缓存到三台机器上,你会想到什么方案呢? 我们可能首先想到的方案,是取模算法hash(key)% N,对key进行hash运算后取模,N是机器的数量。key进行hash后的结果对3取模,得到的结果一定是0、1或者2,正好对应服务器node0、node1、node2,存取数据直接找对应的服务器即可,简单粗暴,完全可以解决上述的问题。 hash的问题 取模算法虽然使用简单,但对机器数量取模,在集群扩容和收缩时却有一定的局限性,因为在生产环境中根据业务量的大小,调整服务器数量是常有的事;而服务器数量N发生变化后hash(key)% N计算的结果也会随之变化。 比如:一个服务器节点挂了,计...
- 下一篇
腾讯的这朵「云」,想让设计普惠大众
本文为爱范儿(ID:ifanr)原创,作者:江翁翁,开源中国经授权发布。 在你每天用手机聊天、看短视频的时候,你也许会有这些问题:这些 app,为什么会长这样?为什么这个按钮是红色而不是其他颜色?为什么划一下就能看到下一条视频? 这些设定的背后,都由「设计」推动。无论是用户界面、平面设计甚至其他领域,设计已成为复杂而庞大的一个整体,牵一发而动全身;但面对快速更迭的用户需求与审美趋向,「快」又成为各类新产品乃至新团队的生命线。 这一过程中,如何在「好」与「快」的取舍中取得甜蜜点,已成为各家互联网团队必须面对的问题,因此各种各样的设计指南、前端框架与设计工具层出不穷。在此之上,所有人都更期待有一种服务,可以将设计与开发流程中最基础、最细节的部分整个打包,提供从设计到开发的整体解决方案。 现在,腾讯就做了这样的事情。这就是「腾讯设计云」。 这朵「云」,是腾讯设计服务的输出 不同于一般纸面上的设计规范或是前端框架,腾讯设计云提供多种和设计相关的服务与工具,为产品研发、平面设计、多媒体创作等设计相关业务打造专属基础服务。无论是产品研发、自媒体发布,抑或是更广泛的设计场景,腾讯设计云都可以提供周密...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,CentOS8安装Elasticsearch6.8.6
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址