ArchitectureSorting

常见架构风格&模式以及关键代码整理

简单整理,如有不正确,请指出。

一、理论

软件架构(Architecture):来源建筑学即系统的基本结构和组织方式。个人理解:即为代码模块的逻辑、物理组织结构以及运行后的表现情况。

架构风格(Architectural Styles):即框架和逻辑的高度抽象,对系统模块、代码组织和逻辑的高级别策略(一般用4+1视图描述)。

架构模式(Architectural Patterns):更加具体,并且特定于系统内的特定问题或模块(具体到可以用代码体现)。

二、架构风格&模式整理

架构风格

数据流风格

调用/返回风格

虚拟机风格

仓库风格

架构模式

GOF 23种设计模式

其他

三、应用开发常见架构&模式

单体&前端

简单三层架构

抽象工厂模式的三层架构

CQRS(命令与查询职责分离) Event Source(溯源事件)

DDD(领域驱动)(DotNet ABP)

Unit Of Work(工作单元模式,仅DotNet中常见)

前端&显示层架构(MV*)

MVC/MVP(罕见)/MVVM/MVU(Model View Update)

React Flux(flux redux等、函数式编程风格)

Vue(早期MVVM ,VUE3近似MVU) 观察者模式

Svelte(近似MVU)

DotNet Blazor(MVU)

WPF/SilverLight(MVVM)

分布式

Actor 模式(DotNet Orleans)

SOA(ESB)

Elastic Search

Rx.NET/RxJs(响应式编程)

OAuth/OpenId(认证服务)

微服务

1代:Dubbo

2代spring cloud、dotnet ocelot polly(罕见)、NACOS

3代Istio、DotNet、Service Fabric(罕见)、(dotnet dapr边车模式)

注:微服务结构的指导思想是:The Twelve-Factor App (简体中文) 实际实现时可能较为多变

嵌入式系统(了解较少)

微内核

宏内核

四、曾使用或研究过的架构风格、模式和关键代码和技巧

应用开发

三层架构

抽象工厂模式三层架构

DDD(DotNet ABP)

Unit Of Work

逻辑视图:

classDiagram

IUnitOfWork <|-- UnitOfWork : 实现

UnitOfWork "1" --> "*" XXXRepository : 持有

IRepository <|-- GenericRepository : 实现

GenericRepository <|-- XXXRepository : 继承

XXXController "1" --> "1" UnitOfWork : 持有

说明:

类似三层架构、通过UnitOfWork对象、仓储以及EF完成增删改查和事务

代码:

https://gitee.com/eddyzhang1986/CloudRecruit.git

CQRS(ENODE)

微服务变体

SOA变体

前端(MV*)

框架开发

自定义LINQ Provider DSL(虚拟机风格)

EAP流程引擎DSL(数据流、虚拟机风格)

逻辑视图:

graph LR

start[开始] --> step1[EAP设备交路流程图]

step1 --> step2[生成状态机状态机描述代码]

step2 --> step3[交由C#解释运行]

step3 --> stop[结束]

graph LR

A((流程引擎)) -- 包含 --> B[前端绘图模块]

A-- 包含 --> C[图到C#正向解析及代码生成模块]

A-- 包含 --> D[C#到图反向解析及图形生成模块]

A-- 包含 --> E[C#EAP设备状态机解析模块]

A-- 包含 --> F[C#动态编译及代码更新模块]

A-- 包含 --> G[绘图及生成代码的版本控制和持久化模块]

A-- 包含 --> H[界面和一般管理模块]

说明:

通过绘图画出EAP设备的交互流程->生成状态机描述代码->交由C#解释运行

代码:

https://gitee.com/eddyzhang1986/wfdesigner.git

低代码引擎、设计器、组件库 DSL(虚拟机、黑板、独立构建风格)

逻辑视图:

graph LR

start[开始] --> step1[通过界面设计器设计出界面]

step1 --> step2[生成界面的描述JSONSchema]

step2 --> step3[交给渲染器渲染出界面]

step3 --> stop[结束]

graph LR

A((低代码引擎)) -- 包含 --> B[低代码渲染器]

B -- 包含 --> C[API数据源子模块]

B -- 包含 --> D[表达式公式及自定义函数子模块]

B -- 包含 --> E[事件子模块]

B -- 包含 --> F[组件池及方法调用子模块]

B -- 包含 --> G[消息总线子模块]

B -- 包含 --> H[组件渲染子模块]

A -- 包含 --> I[低代码设计器]

I -- 包含 --> J[Web 桌面设计器]

I -- 包含 --> K[Mobile 手机端设计器]

I -- 包含 --> L[大屏设计器引擎]

A -- 包含 --> M[其他组态相关]

说明:

通过界面设计器设计出界面->生成界面的描述JSON(类似AST或者UI Tree)->交给渲染器渲染出界面并执行相关逻辑。

渲染器作为内核模块结构较为复杂。

代码:

https://github.com/eddyzhang1986/WebDesigner.git

https://github.com/eddyzhang1986/antd-jsonschema-form.git

https://gitee.com/eddyzhang1986/airscada.git

上、中、下位机通讯-生产者消费者模式(独立构建风格)

逻辑视图:

graph LR

A[下位机设备] -- SOCKET编写的SECS驱动 --> B[中位机HOST]

B -- SOCKET编写的SECS驱动 --> A

B -- REDIS LIST 生产者消费者模式 --> C[上位机软件系统]

C -- REDIS LIST 生产者消费者模式 --> B

说明:

下位机通过SECS协议同中位机(HOST)进行通讯和数据交互->再通过redis中的list数据结构配合生产者消费者模式,一读一写完成 中位机 同上位机的通讯->从而解耦下位机设备和上位机软件系统

代码:

https://gitee.com/xingfujiayuan35/WSNserver.git

SECS驱动(独立构建风格)

Rx.NET/RxJs仅研究(数据流风格)

小型编译或解释器仅研究(数据流、虚拟机风格)

逻辑视图:

graph LR

start[开始] --> step1[Roslyn编译器开放出的接口读取符合一定规则的C#代码]

step1 --> step2[逆向将C#代码转换为机器和EAP间进行交互的流程描述JSON]

step2 --> step3[交由绘图程序绘制出机器和EAP交互的流程图]

step3 --> stop[结束]

说明:

通过Roslyn编译器开放出的接口读取符合一定规则的C#代码->逆向将C#代码转换为机器和EAP间进行交互的流程描述JSON->交由绘图程序绘制出机器和EAP交互的流程图

代码:

https://gitee.com/eddyzhang1986/WF2Parser.git

注意:

以上代码并未完全列举。

因一般常规架构如三层架构等网上有大量资料可以参考且变化不会太大,所以不在此处展开。

另外部分引擎架构和代码仓库限于各方原因不便公开。

所以此处仅列举了一些自己参与过且比较有代表性而又非常独特的架构风格和设计(如本人担任了低代码引擎前端部分的所有的架构设计和核心代码编写、EAP工作流引擎的核心代码编写等)列出

请理解。