结构化设计5/7,架构风格和模式

893 阅读5分钟

师傅最长的路是什么路?REST和RESTful API有什么区别?架构风格和模式是什么?

问题:架构设计的行业最佳实践是什么

REST → RESTful API

REST有一个有点拗口的中文名字“表述性状态转移”,忽略名字的深度含义,简单来说REST规范了HTTP API协议:URL作为资源名词定义、Head作为动词控制参数、Body作为业务数据参数。REST最大的贡献除了规范协议也在团队内达成了API共识。

那么有一个问题:REST和RESTful API有什么区别?

首先看下这两个模型的定义 1.png

然后简单对比下之间的差异点

模型用途场景
REST抽象的架构设计思路理论方法使用
RESTful APIAPI的一种设计方法API层使用

最后总结如下

  • REST - 一种架构风格,表述性状态转移规范描述
  • RESTful API - 一种架构模式,针对Connector的API规范

RESTful API是REST架构风格在Connector连接器问题场景下的应用

行业最佳实践

每个行业都有行业知识沉淀,软件行业的“架构设计”层面知识沉淀是“架构风格和模式”,“代码设计”层面知识沉淀是“设计模式”,“代码”层面的知识积累是“框架+中间件”等,这些设计成果就是在不同业务场景下前人采坑后总结并沉淀的知识。

下面表格中的设计风格就是一些“行业最佳实践”,研发同学应该都了解过相关知识,本次要把学过的知识再次总结抽象提升,下面每一个设计风格都可以单独总结成章,在此不展开说明。

架构风格描述
CS客户端服务器
BS浏览器服务器
插件化功能单元以插件方式管理
组件化功能单元以组件方式管理
发布订阅订阅Topic回调触发使用

架构风格是什么

架构风格 - An architectural style is a coordinated set of architectural constraints that restricts the roles/features of architectural elements and the allowed relationships among those elements within any architecture that conforms to that style. 架构风格即约束。

REST是一种架构风格,表述性状态转移规范约束。

架构风格描述
CS客户端服务器
BS浏览器服务器
插件化功能单元以插件方式管理
组件化功能单元以组件方式管理
发布订阅订阅Topic回调触发使用
管道过滤器Servlet/Filter
消息总线消息总线
REST表述性状态转移
DDD领域驱动业务建模

架构模式是什么

架构模式 - 架构风格在某个特定上下文问题中的解决方案。

RESTful API是一种架构模式,是REST风格在Connector API场景中的问题解决方案。

架构模式所属架构风格描述
MVC组件化Model-View-Controller
MVVM组件化Model-View-ViewModel
ESB消息总线企业服务总线
三层架构分层架构表现层-业务层-持久化层
微核心架构插件化
管道命令行管道过滤器Channel-Filter
六边形架构分层架构应用层-插件层-适配器层
Clean架构分层架构
RESTful APIREST表述性状态转移
CQRSDDD领域驱动设计
Event SourcingDDD领域驱动设计

注:架构风格和模式并没有行业标准定义

风格模式设计方法

架构风格 + 架构模式 = 风格模式设计方法

行业有架构风格和模式的定义,但是相信大部分研发同学并没有使用过,没有使用过1是因为没看过;2是因为比较难用。领域驱动开发(DDD)在行业中享有盛名,但是在产品代码层面很难落地一样,风格模式在具体项目中很难应用并且没有标准使用方法。

类比思维也是常用的思维方式,下面用一种类似来说明风格和模式的作用。

如何设计寺庙宫殿

建筑设计和架构设计有一定共通性,借鉴风格模式的设计的思路和方法去思考如何设计寺庙宫殿。

寺庙宫殿 4.png

首先抽象下寺庙宫殿的共性风格是什么,以成果导向思考需要达到什么约束就成为寺庙宫殿。参照上图直接抽象出架构风格。

  • 庄严肃穆
  • 有一定高度
  • 有房顶和尖角颜色鲜艳
  • 门和装饰多

然后使用架构风格的约束条件,在中西方不同场景下针对性设计如下。

架构模式模式表达
中式寺庙模式5.png多层角、主色红色黄色、左中右三道门、琉璃瓦
西式宫殿模式6.png多层楼、连廊和柱子、多门窗、多雕刻

最后得到的就是有一定专业深度的架构设计成果,风格和模式的另外一个作用是发现冲突或不和谐,比如下面视图,明显存在风格模式冲突的混搭风设计,混搭风不是问题,问题是容易导致团队无法很好达成共识并导致最终设计不一致。

建筑混搭风

z.png

在代码层面同理,如果将不同层次间的代码合并到一起,一定会有明显的代码“坏味道”。

代码混搭风

c.png

分层架构风格模式

使用架构风格和模式方法描述分层架构设计。

分层架构

  • 架构风格 - 分层架构,约束(分层,上层依赖下层,下层不依赖上层)
  • 架构模式 - 三层系统架构、N-Layer层系统架构 分层架构风格的具体应用,六边形架构模式和Clean架构模式 8.png

领域驱动风格模式

使用架构风格和模式方法描述领域驱动设计。

领域驱动设计

  • 架构风格 - 业务建模,约束(上下文、领域、子领域、实体和服务)
  • 架构模式 - 微服务领域设计、CQRS、Event Sourcing 9.png

结构化设计总结

结构化设计设计总结
架构风格一组约束条件
架构模式架构风格在某个特定上下文中的解决方案
Architecture Stylearchitecture approach.
Architecture Pattern{ problem, context } → architecture approach.

行业中的最佳实践就是积累的各种架构风格和模式。