乐于分享
好东西不私藏

【架构设计】基于架构的软件开发

【架构设计】基于架构的软件开发

架构师合集

基于架构的软件开发方法

ABSD

Architecture-Based Software Development

看名字就是知道了,这是一个以架构为驱动的方法

—— 在开始软件开发之前,先把整个架构设计好

更详细地说,由 商业、质量和功能需求 的组合来共同驱动软件架构的设计

为什么呢?🤔

这就不得不提到 结构化设计 SD

SD 是一种面向数据流的开发方法

—— 通过自上而下进行功能分解,从而设计出模块和他们之间的关系

—— 只确定了做什么,怎么做

但是功能的分解实现只是 软件开发的 一部分

更重要的还有 质量属性、商业 等要求

—— 就是关注 性能,安全,可维护,成本等多种非功能需求

比如说你实现一个商城,是能完成功能了,但是又慢又容易崩溃,或者说 一个小商城采用过度的高并发设计,在技术上付出太多money,导致收不回本

这便是 基于架构 要解决的问题

—— 要能做得到,还能做得好

那这个 ABSD 是怎么做的呢

  • 三个核心

  • 六个步骤

  三个核心  

三个核心,就是 

  • 功能分解

  • 选择架构风格

  • 选择软件模板

① 功能分解,这个和SD是一样的,通过 自上而下的方法, 把庞大复杂的系统拆解为多个职责单一、相对独立的小模块

比如一个商城,先将其在概念上分解为 【订单子系统】 【支付子系统】 【用户子系统】,把一整块错综复杂的业务逻辑 梳理成分类有序的模块

附上一张 SD 的 模块结构图

② 选择架构风格,架构风格 来确保系统能满足性能、安全性等非功能质量需求和商业需求

因为同一种功能,可以有多种架构风格选择,而只有多方的考虑,才能确定具体的风格

比如说如果强调安全性,就会选择 层次结构风格,分成4层或者N层,重要的资产放在内层保护

但是分层架构为了实现解耦,数据会层层传递,这就会影响性能

但是如果同时强调性能,就可能会允许越级调用的开放型分层模式

也就是从严格的层层传递,A→B→C→D

变成了特殊请求可以越级传递,A→C

再比如说 实现一个企业管理系统

只为了实现功能,可以选择 C/S风格(客户端/服务器),功能性更丰富

但是 客户要求 便利性,可能就选择 B/S风格(浏览器/服务器)

然后 客户又要求安全性,而C/S风格在 安全性不足,转而重新选择 B/S 架构

③ 选择软件模板,就是利用已有的成熟的软件结构作为抄袭借鉴

风格只是一个大体的设计方向, 而市面上不同风格早就有了成熟的软件设计,所以可以直接借鉴,直接免去了整体设计这一步了

比如说你的系统想开发一个插件功能,支持动态热拔插的形式扩展功能

你就可以借鉴编辑器的插件架构,比如说 Eclipse IDE ,Vscode

  • 保持微小的核心,定义插件的规范、维护一个插件注册表,以及负责插件的查找、装入和注销

  • 扩展点,核心系统对外开放许多插槽,接入插件的地方

  • 动态热拔插,基于OSGi动态模块化规范,可以在不重启系统的情况下实现插件的安装、更新和卸载

不用在意怎么实现了,以后直接就

“AI 帮我参考 Vscode 的插件架构,开发一套插件功能”

所以了解就好

  六个步骤  

这个是真正要进入开发了,实打实的执行步骤

  • 架构需求

  • 架构设计

  • 架构文档化

  • 架构复审

  • 架构实现

  • 架构演化

整个过程是一个螺旋循环迭代的过程,不是一蹴而就的

而且每个步骤又细分了很多步骤,是真正的有实质性指导意义的开发方法,不整虚的

就是这玩意用词确实晦涩难懂,但是其实也就需求开发那点东西

架构需求

具体分为五个步骤

  • 需求获取

  • 生成 类图

  • 对类图分组

  • 类打包构件

  • 需求评审

这一看就抽象得不行,不用怕!

需求获取,关注的不仅是功能,更重要的是 非功能需求,性能,可靠性,安全性等等

比如说做一个商城的抢购功能,看起来的流程和 商品购买 没有什么两样

但是抢购开始的那一瞬间,可能会有几百万用户同时疯狂抢购,那么

—— 这种海量并发系统不崩溃,商品不会超卖 就是 架构的需求

而为了满足这些目标,架构师才会决定在系统里引入集群、分布式缓存和消息队列 等设计

高并发的架构可以参考这里 高并发架构

标识构件分为三步,其实核心就是整理需求

  • 生成类图,提取出最基础的业务实体代码模型,比如说订单 、订单明细,商品,用户 ,商品评价等等

  • 对类分组,把上面的这些类,按照关联性分组,比如说,“订单”和“订单明细”就是 一个组,商品 和 商品评价一个组

  • 类打包成构件,把刚才分好组的,封装成具有标准接口的实体。比如说 ,把 订单+订单明细 直接打包成一个大粒度的 订单管理构件

需求评审,就是看你的构件组合是否合理,是否有遗漏,并且评审非功能的需求是否合理

“10 万并发搞这么多?我们有这么热门吗”

“1s 就响应?3s 行不行”

循环,评审没通过,回到第一步,重新获取需求,标识构件...

架构设计

具体也是五步

  • 提出架构模型

  • 映射构件

  • 分析构件相互作用

  • 产生架构

  • 设计评审

提出架构模型,就是选择一个合适的架构风格

射构,把 架构需求中得到的 构件,对应地放到架构风格模型中

因为 架构的 3C模型分为了 构件,连接件,约束嘛

也就是架构  定义了系统内构件的样子,构件的协作

还不了解什么是架构 → 架构

所以这里把前面的构件 试图一一对应到 架构风格的 构件中

比如说 上一步采用了 微服务架构,那么 订单构件,支付构件,库存构件 就作为独立的构件

分析构件相互作用,规定这些构件之间如何通信、数据如何流转

比如说 订单微服务 不能直接调用 库存微服务,而是必须通过一个消息队列(连接件)进行异步通知

产生架构,通过上述内容的确定,就可以画出完整的架构图了

系统有什么元素,元素之间怎么通信

通常就是用UML 绘制 4+1 视图,因为架构不是给一个人看的,这里的是实现视图

设计评审,还要评审,评审你这个架构 是否 顶得住那些需求

“一个消息队列就想抗住10w并发?”

于是你就打回重新设计,加入了 Redis 缓存层

架构文档化

前面都是一些草图,比较零散和抽象

现在就要落地成规范正式的说明文档了

具体就是两个产物

  • 架构规格说明

  • 测试架构需求的质量设计说明书

架构规格说明

—— 说明你的架构决策 和 设计原因,比如为了高并发才选择的消息队列通信,然后通过 4+1 视图 多视角 描述架构

—— 明确构件的职责,明确 订单服务 和 库存服务 这两个构件的职责和具体的交互接口

测试架构需求的质量设计说明书

—— 就是根据前面定的质量标准,制定要怎么去测试

—— 比如  验证性能目标,要在什么环境下,要如何触发 每秒 10 万次并发

这份设计文档的要求就是 要足够通俗易懂

—— 要所有人都能看懂,即使没有参与过程,拿到文档也能轻松看懂,知道自己接下来的代码该怎么写

架构复审

这一步的架构复审 和 第二步架构设计的技术评审 是不一样的

第二步的技术评审,只是一个草图大概

而 架构复审,是针对上一步得到的 正式文档

其实就是 更全面的架构评估,找出 敏感点、权衡点、风险点

通过各种专业的评审方法,比如 SAAM 、ATAM、CBAM 等

内容太多,可以看这里 架构评估

简单说

你的这个架构不能只兼顾某个 质量属性

比如说为了安全,你就把加密级别调到最高,导致解密严重影响性能

那这个 安全属性,就是 权衡点

比如说当前的架构设计性价比是否高,比如一个小商城,确定要使用 纯高并发设计吗? 这就是 成本的考量

当前的技术团队,没有实现这个架构的经验,这便是 风险点

架构实现

万事俱备,只欠东风了

要开始投入真正的开发了,步骤看起来晦涩,其实就是开发

  • 分析和设计

  • 构件的实现

  • 构件的组装

  • 系统测试

分析和设计,就是针对架构,开始分工了,各自开展内部的详细设计

构件的实现,分为三种,一种直接用第三方,一种是开发,一种是从老系统抽离,比如说 

  • 消息队列构件,直接用第三方的 Kafka

  • 订单构件,需要自己实现

  • 支付构件,在其他系统中有实现,可以试图抽离成公共构件

构件的组装,其实就是构件之间的联调呗

把写好的构件实体相互连接拼装起来,完成整个软件系统的合成

系统测试,我测!

  • 单个构件独立的功能测试

  • 全局的功能测试

  • 质量属性场景的测试

循环开始,测试:“用例不通过,打回重做”

架构演化

演化,其实就是正常迭代了

步骤依旧抽象,分为

  • 需求变化分类

  • 架构演化计划

  • 架构变动

  • 更新构件相互作用

  • 构件组装和测试

  • 技术评审

其实就是架构实现那一part的变种罢了

需求变化分类,分析新需求,进行分类,确认是修改已有构件还是创建新构件

架构演化计划,其实就是制定任务并分配,比如说确定是修改 订单构件了,那么就

“XXX 你去开发”

“定在下周联调,下下周发布!”

架构变动,其实就是对 构件的增删改了

更新构件相互作用,构件的增删改,肯定要重新更新他们之间的交互逻辑。

比如说 订单构件 新增的逻辑,在购买管控物品前,先去检查该人是不是实名认证

那么在 调用订单构件之前,应该先调用 认证构件

其实我觉得这部分应该是在架构变动中的

构件组装和测试,写完就重新联调,进行整体的测试

看看改完之后,会不会影响之前 10w并发的目标

技术评审,评审架构是否满足了功能需求 和 非功能需求

比如说加了 实名认证,导致订单响应慢了1s

“这怎么回事啊!这是硬性指标啊,加个认证就1s,那加个优惠券是不是又要1s?最后要10s 生成一个订单?”

看完这6大步骤

估计头都要晕古7了

但是只要记住 ABSD 是架构驱动为主

—— 由 商业、质量和功能需求 的组合来共同驱动

因为一个软件不只有功能,所以架构的设计才显得尤为重要

当然了 ABSD 的详细执行步骤看着确实很繁琐

但是实际执行的时候都是动态的,因为是教科书,所以尽量是以详细为主

简化来说无非就4点

  • 确定架构目标

  • 确定架构风格 和 套用成熟模板

  • 架构评估是否满足目标,多种属性等

  • 架构开发

而 ABSD 也不是所有场景都适用,一看就是大场面选手,不然那这些步骤折腾来折腾去,我都开发完了

所以小需求,其实 SD 就已经足够了

(完)