MASA Framework - 整体设计思路

源起

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

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

b2f553e932d7c9802856949a9cee8c9f.png

在分布式架构中,它以Sidecar的形式守护在应用身旁。

如果在.Net项目中,它是否可以类似.Net Framework作为基建/适配器/中间件/总线等身份驻留在.Net进程中提供基础能力?

设计思路

一个完整的设计要先从概念开始,为了降低学习成本我们直接复用Dapr的概念定义

概念

构建块

提供接口标准,并为了达到某个基础能力的串接不同组件(也通过接口),松耦合但不脱钩

组件

基于接口标准的实现,比如服务间通讯提供HttpClient和Dapr Service Invocation等不同组件的实现

工具库

提供更抽象的底层能力,供业务和组件完成自身功能,如缓存/配置/数据操作/安全等

Roadmap - v1.0

  • 基于.Net主推技术栈,不魔改,降低学习成本

  • 提供项目模板,根据业务需求自由组合功能集合

  • 支持单体架构,也支持分布式架构

  • 支持DDD方法论,也支持CQRS

  • 尽量小的依赖集合,但不为了小而小

  • 约定优于配置

  • 有创新,且要经过生产验证

fab03acd7929410586df4acf4027fb82.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、充血模型

d42352519c7ffd771fd2130f00219c47.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

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

4b0be56e1cce5766f4bf8407e526bd44.png

参考

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​怎么用藏头诗向女友表白......

1 遇到不好使的水龙头时▼2 今天去你家玩好不好(素材来源网络,侵删)▼3 男朋友多会拍照(素材来源网络,侵删)▼4 干饭人有多难▼5 麻将的内涵!(素材来源网络,侵删&…

cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线

点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:怎么得到白色Blob中心线,他希望的效果如下:显然Op…

求字符串里里面字符出现的次数和出现哪些不同的字符的字符串

题目: 字符串里里面字符出现的次数和出现哪些不同的字符 such as 字符串“aaaabbbccd” 打印出出现a4次,b3次,c2次,d1次,出现的不同字符的字符串为“abcd”,或者按照规则打印字符串“4a3b2c1d” 代码: #include <stdio.h> #include <stdlib.h> #include &l…

[20140928]创建连接到MySQL的连接服务器

[20140928]创建连接到MySQL的连接服务器 首先要安装 mysql odbc然后 odbc下创建DSN&#xff0c;并且要在系统DSN下。最后执行exec sp_addlinkedserverserver XY,--这是链接服务器的名称srvproduct mysql,--这个你自己随便吧provider MSDASQL,--这是固定的&#xff0c;不能瞎填&…

又砸又烧,还要泼脏水,这谣言到底什么时候才没人信?发生这样的事真没想到.........

全世界只有3.14 % 的人关注了爆炸吧知识曾经看到一条新闻&#xff0c;说的是漂亮国人民怀疑口罩上的那个鼻梁条是5G天线&#xff0c;它不仅能控制人&#xff0c;还能致癌。“所以这就是他们计划杀死我们的方式&#xff0c;他们把5G电线放在了这里&#xff0c;就在这。”一名女子…

如何使用ASP.NET Core Web API实现短链接服务

前言在前面的文章中&#xff0c;我们介绍了hashids.net&#xff0c;可以将数值型Id加密成无意义的字符串。今天&#xff0c;我们来利用这一特点&#xff0c;实现短链接服务。原理短链接&#xff0c;顾名思义就是在形式上比较短的链接网址。借助短链接&#xff0c;可以用简短的网…

[LeetCode]--20. Valid Parentheses

Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid. The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not. public boo…

人生如梦

人生就像一场虚无的梦&#xff0c;可是我已经醒了&#xff0c;我只想过得真实一点

C语言atoi()函数:将字符串转换成int(整数)和sprintf和memset

atoi()函数 #include <stdio.h> #include <stdlib.h>int main () {int i;char buffer[256];printf ("Enter a number: ");fgets (buffer, 256, stdin);i atoi (buffer);printf ("The value entered is %d.", i);system("pause");re…

python 写入excel_一行一行整理EXCEL表太麻烦,试试python脚本,1秒写入数据

最近工作中&#xff0c;要整理数据&#xff0c;本来是以sql脚本录入&#xff0c;但是id、barcode等数据不好整理&#xff0c;因为这几个字段要唯一。所以想到用EXCEL表整理数据&#xff0c;再导入数据库中。整理的过程中&#xff0c;发现EXCEL一行一行的修改也挺麻烦&#xff0…

ORACLE 数据库安装后,PL/SQL的登录问题完美解决

windows7 64位系统 安装完oracle 后的用法如下分享链接&#xff1a;http://www.2cto.com/database/201307/226853.html#comment_iframe安装完PL/SQL后 。当你登陆时。你会遇到各种那个疼的问题。 例如&#xff1a;监听程序在CONNECT_DATA 中未获得SERVICE_NA 无监听程序 无法解…

3、AngularJS2 架构

2019独角兽企业重金招聘Python工程师标准>>> Angular 2 应用程序应用主要由以下 8 个部分组成&#xff1a; 1、模块 (Modules)2、组件 (Components)3、模板 (Templates)4、元数据 (Metadata)5、数据绑定 (Data Binding)6、指令 (Directives)7、服务 (Services)8、依…

Kubernetes:实现应用不停机更新

本篇主要讨论如何实现滚动更新和回滚&#xff0c;任意更换版本并且回滚以前的版本(版本更新)&#xff0c;而下一章会讨论到 Pod 缩放&#xff0c;根据机器资源自动拓展和收缩应用(自动扩容实例)。本文为作者的 Kubernetes 系列电子书的一部分&#xff0c;电子书已经开源&#x…

iOS 7 如何关闭已打开的应用(App)

刚升级了 iOS 7&#xff0c;感觉不太会用了。 在多任务状态下&#xff0c;看着一个个已被打开的应用&#xff0c;不知道如何关闭了。 问了下朋友才知道&#xff0c;在多任务状态下&#xff0c;将对应的应用 向上划 就行。 听说&#xff0c;和 Android 一样的 &#xff1f;&…

除掉字符串里面相同的字符

题目: 除掉字符串里面相同的字符 such as 字符串“aaaabbbccdd” 出去相同的字符就会变成“abcd” 代码: #include <stdio.h> #include <stdlib.h> #include <string.h>void grepString1(char a[]) {int length = strlen(a);int i = 0, j = 0;for (i=0; i…

inner join 和 exists 效率_一个in、exists、join的简单测试

创建两张表先单独插入两条数据然后批量插入部门号为10,20,30,40的数据各10499099条然后dept表也插些干扰数据测试语句开始验证in和exists和join 先比较个占比多的部门&#xff0c;再比较占比少的 1、 in 占比多 select count(*) from scott.EMP_TEST e where e.deptno in (sele…

httpModules 与 httpHandlers

httpModules 与 httpHandlers ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给ASPNET_ISAPI.dll&#xff0c;ASPNET_…

uva10160(dfs+状态压缩)

题意&#xff1a;给出n个点&#xff0c;以及m条边&#xff0c;这些边代表着这些点相连&#xff0c;修一个电力站&#xff0c;若在某一点修一个站&#xff0c;那么与这个点相连的点都可以通电&#xff0c;问所有的点都通电的话至少要修多少个电力站........思路&#xff1a;最多…

CAD数据与ArcGIS数据的互转换(转载)

CAD数据往往是分层管理的&#xff0c;将CAD数据转成arcgis数据&#xff0c;最担心的莫过于丢失了属性数据&#xff0c;arcgis9.2提供了一种方法&#xff0c;可以将CAD数据完整的转换为personal geodatabase&#xff0c;属性信息不会丢失&#xff0c;方法如下&#xff1a;ArcToo…