软件架构设计与评估
本章深入探讨各种软件架构风格(如微服务、云原生),以及架构设计的质量属性评估方法(ATAM)。
1. 模块独立性 —— 聚合 (Cohesion)
【考试要点解析】 内聚和耦合是评价模块质量的一对“双子星”。高内聚是我们的终极目标。所谓高内聚,就是让一个模块“专心致志干一件事”。考试经常考这 7 种类型的排序,你得记住:功能内聚最好,比如“计算工资”模块,里面所有代码都是为了算工资;偶然内聚最差,比如把“打开文件”和“打印错误”硬塞在一个函数里,纯粹是因为它们凑巧在代码的同一行。
衡量模块内部各元素结合的紧密程度(越高越好)。
- 功能聚合 (最强):模块执行单一功能,各部分必不可少。
- 顺序聚合:前一部分输出是后一部分输入。
- 通信聚合:操作使用相同数据或产生相同输出。
- 过程聚合:动作必须按特定次序执行。
- 时间聚合:动作必须在同一时间内执行。
- 逻辑聚合:逻辑上相似但功能无关(如一个函数根据参数做不同事)。
- 偶然聚合 (最弱):动作之间无关系或关系松散。
2. 模块独立性 —— 耦合 (Coupling)
【考试要点解析】 低耦合是另一条准则。就是让模块之间“少联系,多独立”。考试重点是区分这几种耦合:数据耦合最好,只传几个数字或字符串;标记耦合次之,传整个结构体(虽然只用了一部分);控制耦合就不好了,传个 Flag 去指挥别人怎么干活;公共耦合很糟糕,大家共用一个全局变量,容易这就叫“牵一发而动全身”;内容耦合最差,直接跳到别人家里(代码内部)去搞事情。
度量模块间依赖程度(越低越好)。
- 非直接耦合 (最低):无直接关系,通过主模块调用。
- 数据耦合:通过数据参数交换信息。
- 标记耦合:传递记录信息(数据结构)。
- 控制耦合:传递控制信息(影响逻辑)。
- 外部耦合:访问同一全局简单变量。
- 公共耦合:访问同一公共数据区域。
- 内容耦合 (最高):直接访问内部信息或代码重叠。
3. 软件架构风格
【考试要点解析】 架构风格就是“盖房子的套路”。考试常在下午的论文题里让你选型。
- 管道-过滤器:就像自来水处理厂,水进来,经过过滤、消毒、沉淀(过滤器),最后出来净水。适合批处理,但不适合要跟人互动的系统。
- 事件驱动:就像开 Party,有人喊一嗓子(事件),感兴趣的人就去做动作。适合图形界面(GUI (Graphical User Interface, 图形用户界面))或者调试器。
- 黑板系统:就像一群专家围着黑板解难题。语音识别就是这么干的,因为没法一下子算出来,得靠大家凑。
- 分层架构:就像做汉堡,一层面包一层肉。Web 开发最常用,但也容易导致“穿透”问题(改底层得动上层)。
| 风格大类 | 子风格 |
|---|---|
| 数据流风格 | 批处理序列、管道-过滤器 |
| 调用/返回风格 | 主程序/子程序、面向对象、分层架构 |
| 独立构件风格 | 进程通信、事件驱动系统 (隐式调用) |
| 虚拟机风格 | 解释器、规则系统 |
| 以数据为中心 | 数据库系统、黑板系统、超文本系统 |
4. 云原生架构风格
【考试要点解析】 云原生是这两年的大热点,核心意思就是应用“生在云上,长在云上”。 考试重点是它的四大支柱:微服务(拆分)、容器化(打包)、DevOps (Development and Operations, 开发运维一体化)(开发运维一体)、持续交付(快速上线)。 还得区分三种服务模式:IaaS (Infrastructure as a Service, 基础设施即服务) 是买地皮(基础设施),PaaS (Platform as a Service, 平台即服务) 是买装修好的房子(平台),SaaS (Software as a Service, 软件即服务) 是直接住酒店(软件服务)。
云计算:对用户屏蔽底层差异的分布式处理架构,资源按需服务。 特点:超大规模、虚拟化、高可靠性、高可伸缩性、低成本。
服务类型分类:
- SaaS (软件即服务):直接提供应用程序(多租户)。 (SaaS: Software as a Service)
- PaaS (平台即服务):提供虚拟中间件、运行环境、OS (Operating System, 操作系统)。 (PaaS: Platform as a Service)
- IaaS (基础设施即服务):提供服务器、存储、网络。 (IaaS: Infrastructure as a Service)
部署方式:公有云、私有云、混合云。
5. 微服务 vs SOA
【考试要点解析】 这是架构选型题的必考点。微服务其实是 SOA (Service-Oriented Architecture, 面向服务的架构) 的“进化版”或“轻量版”。 SOA 像个大企业,强调部门间的协作,有个很重的总线(ESB (Enterprise Service Bus, 企业服务总线))来做翻译和协调,适合搞定那些复杂的遗留系统。 微服务 像特种部队,每个服务都很小、很独立,自己管自己,大家用简单的协议(如 REST (Representational State Transfer, 表述性状态转移))沟通。它强调“去中心化”,适合快速迭代的互联网应用。
| 特性 | 微服务 | SOA (面向服务架构) |
|---|---|---|
| 拆分粒度 | 细粒度,能拆则拆 | 粗粒度,倾向于整合 |
| 划分方式 | 纵向业务划分 | 水平分层 |
| 团队 | 单一组织/小团队负责 | 不同部门分层负责 |
| 通信 | 轻量级 (HTTP/REST) | 企业服务总线 (ESB) |
| 复杂度 | 组件小,逻辑在服务内 | 组件复杂,逻辑跨领域 |
| 独立性 | 独立开发、部署、运行 | 依赖共享组件 |
6. SOA 关键技术
【考试要点解析】 虽然微服务火了,但 SOA 的这“老三样”标准协议在银行、电信这些传统行业还是很稳的。
- WSDL (Web Services Description Language, Web服务描述语言):是“说明书”,告诉别人你的服务能干啥、怎么调。
- SOAP (Simple Object Access Protocol, 简单对象访问协议):是“信封”,用来装数据的,格式很严谨(XML (eXtensible Markup Language, 可扩展标记语言))。
- UDDI (Universal Description, Discovery, and Integration, 统一描述、发现和集成):是“电话本”,用来查服务在哪儿。
- UDDI (统一描述、发现和集成):服务注册与发现的标准。
- WSDL (Web 服务描述语言):描述服务做什么、如何访问、位于何处。
- SOAP (简单对象访问协议):基于 XML 的交换协议。包含封装、编码规则、RPC 协定、绑定。
7. 微服务
【考试要点解析】 微服务虽然好,但也不是万能药。优点是独立部署(改一个不用动全身)、技术自由(你想用 Java 他想用 Go 随便)。缺点是复杂,本来在一个进程里调个函数就行,现在变成网络调用了,得考虑超时、重试、熔断,还得搞分布式事务。考试常考微服务的治理组件:注册中心(如 Nacos)、配置中心、网关(Gateway)、熔断器(Sentinel)。
优势:
- 解耦:易于小团队开发。
- 独立:独立开发、测试、部署、运行。
- 技术异构:不同服务可用不同技术栈/数据库。
- 容错:故障隔离,支持降级。
- 松耦合:易扩展。
挑战:分布式数据一致性、服务间依赖测试复杂、运维复杂。
8. MVC 架构
【考试要点解析】 MVC 是最经典的 UI 架构,核心就是“别把鸡蛋放在一个篮子里”。 Model 管数据和逻辑,View 管怎么展示,Controller 管怎么分发用户请求。 在 Java Web 里,Bean 是 Model,JSP 是 View,Servlet 是 Controller。后来演化出的 MVP 和 MVVM(Vue/React 用的)都是它的变体,核心还是分离关注点。
- Model (模型):处理数据逻辑,存取数据库。 (J2EE: Entity Bean, Session Bean)
- View (视图):处理数据显示。 (J2EE: JSP)
- Controller (控制器):处理用户交互,读取视图数据,控制输入并发送给模型。 (J2EE: Servlet)
9. 缓存使用模式
【考试要点解析】 想系统快,缓存少不了。
- Cache-Aside:最常用,就是“旁路”。业务代码自己去查缓存,没有再去查库并回填。适合读多写少。
- Read/Write-Through:业务代码只管读写,缓存组件自己在背后搞定同步数据库的事,对业务透明。
- Write-Behind:最激进,先写缓存就返回成功,然后异步慢慢刷到数据库。快是快,但要是断电了,数据就丢了。
- Cache-Aside (旁路缓存):应用负责读写缓存和数据库。读多写少场景。
- Read-Through/Write-Through (读写穿透):应用只操作缓存,缓存组件负责同步数据库。
- Write-Behind (异步缓存写入):数据先写缓存,异步批量写数据库。性能高但有数据丢失风险。
10. 虚拟机 vs 容器
【考试要点解析】 容器(Docker)是云原生的基石。它和虚拟机的核心区别在于隔离级别。 虚拟机是“盖了一栋新房子”(操作系统级隔离),很重,启动慢。 容器是“在房子里隔了个单间”(进程级隔离),共享地基(内核),很轻,启动只要几毫秒。
| 对比项 | 虚拟机 (VM) | 容器 (Container) |
|---|---|---|
| 镜像大小 | GB 级 (含 GuestOS) | MB 级 (仅 Bin/Lib) |
| 资源 | 按核/GB 分配 | 按进程动态分配 |
| 启动 | 分钟级 | 毫秒级 |
| 隔离 | 系统级 (OS 隔离) | 进程级 (Cgroups) |
| 伸缩 | 手动/慢 | 自动/快 |
11. 边云协同分类
【考试要点解析】 物联网时代,光靠云端算不过来,还得靠边缘计算。边云协同就是“云端大脑+边缘手脚”。 比如自动驾驶,车子自己(边缘)得实时判断刹车,这叫资源协同或智能协同;而云端负责收集所有车的数据来训练模型,这叫数据协同。考试会给你个场景让你分类。
- 资源协同:边缘节点资源调度。
- 数据协同:边缘初步分析,云端深加工。
- 智能协同:云端训练模型,边缘执行推断。
- 应用管理协同:云端开发测试,边缘部署运行。
- 业务管理协同:业务编排。
- 服务协同:SaaS 服务按需分布。
12. 负载均衡
【考试要点解析】 高并发架构的门神。 四层负载(如 LVS)工作在 TCP 层,只看 IP 和端口,转发快;七层负载(如 Nginx)工作在 HTTP 层,能看懂 URL,可以根据内容做转发。 算法里,一致性哈希是重点,特别是在缓存集群里,加减节点时能把数据迁移量降到最低。
技术层级:
- 应用层:HTTP 重定向、反向代理 (Nginx)。
- 传输层:DNS 负载均衡、NAT。
- 硬件:F5。
- 软件:LVS, Nginx, HAproxy。
算法 (静态):
- 轮转 (Round Robin):轮流分配。
- 加权轮转:考虑性能差异。
- 源地址哈希:IP 哈希,保证同一 IP 访问同一服务器。
13. 软件架构复用
【考试要点解析】 复用就是“不重复造轮子”。 机会复用是“碰巧发现”这个模块以前写过,拿来用用;系统复用是“蓄谋已久”,在设计之初就规划好了哪些要复用,产品线架构就是典型的系统复用。
类型:
- 机会复用:开发中发现可复用资产即复用。
- 系统复用:开发前规划复用。
过程:构造/获取资产 -> 管理资产 -> 选择并复用资产。
14. REST (表述性状态转移)
【考试要点解析】 REST (Representational State Transfer, 表述性状态转移) 不是标准,是一种“风格”。它的核心是资源。 必须掌握它的无状态原则,服务器不存 Session,每次请求都带齐所有信息,这样服务器就能随便扩展。还有统一接口,用 HTTP 的标准动词(GET/POST)来操作资源。
基于 HTTP 和 XML/JSON (JavaScript Object Notation, JavaScript对象表示法) 的 Web 通信架构风格。 5 个原则:
- 资源抽象。
- 唯一资源标识 (URI (Uniform Resource Identifier, 统一资源标识符))。
- 通用接口 (GET, POST 等)。
- 操作不改变标识。
- 无状态操作。
15. REST API 命令
【考试要点解析】 HTTP 动词是有讲究的。 GET 是查,它是安全的,不管调多少次都不会改数据; PUT 是改,它是幂等的,调一次和调十次结果一样(全量覆盖); POST 是增,它不幂等,调两次就加了两条数据; PATCH 是局部改,只改变动的部分。
- GET:检索资源 (幂等)。
- POST:创建资源。
- PUT:更新资源 (全量替换)。
- DELETE:删除资源。
- PATCH:部分更新。
- HEAD:获取头信息。
16. 架构权衡分析法 (ATAM)
【考试要点解析】 架构评估是案例分析的常客。ATAM 的核心在于权衡。它不是只盯着一个指标看,而是看不同质量属性怎么打架(比如加密虽然安全了,但性能肯定会降)。它通过构建场景来分析这些冲突。
针对性能、实用性、安全性、可修改性进行评价和折中。 主要活动:场景和需求收集 -> 架构视图描述 -> 属性模型构造和分析 -> 折中。
17. 架构评估关键点
【考试要点解析】 这四个词必须分清,案例题填空必考:
- 敏感点:牵一发而动全身的点,动一下这个参数,性能就剧烈变化。
- 权衡点:左右为难的点,动一下这个,安全好了,性能差了。
- 风险点:可能会暴雷的地方。
- 非风险点:稳稳当当的地方。
- 风险点:潜在问题的架构决策。
- 非风险点:可接受的决策。
- 敏感点:影响一个质量属性的特性。
- 权衡点:影响多个质量属性的特性(通常是矛盾的,如加密增强了安全但降低了性能)。
18. 场景描述六要素
【考试要点解析】 怎么描述一个质量需求?不能光说“系统要快”。得用场景六要素:“在双 11 高峰期(环境),用户(刺激源)发起下单(刺激),订单系统(制品)在 500 毫秒内(响应度量)完成了处理(响应)。”这才是专业的描述。
- 刺激源:生成刺激的实体。
- 刺激:到达系统的条件/事件。
- 环境:刺激发生的条件(如过载、正常)。
- 制品:被激励的系统部分。
- 响应:采取的行动。
- 响应度量:对响应的度量指标(如延迟时间)。
19. 质量属性分类
【考试要点解析】 分清开发期和运行期。 开发期是给程序员看的,比如可维护性(代码好不好改)、可移植性(换个服务器能不能跑)。 运行期是给用户用的,比如性能(快不快)、可用性(稳不稳)、安全性(会不会被黑)。
开发期:易理解性、可扩展性、可重用性、可测试性、可维护性、可移植性。 运行期:性能、安全性、可伸缩性、互操作性、可靠性、可用性、鲁棒性。
20. 常见质量属性策略
【考试要点解析】 这是写论文的万金油。
- 想提性能?加缓存、加并发、优化算法。
- 想提可用性?搞冗余(主备)、搞心跳检测。
- 想提安全性?加密码、查日志、搞授权。
- 想提可修改性?解耦、用接口、配置文件。
- 性能:优先级队列、资源调度。
- 可用性:冗余、心跳检测。
- 安全性:追踪审计、认证授权。
- 可修改性:信息隐藏、接口分离。
- 易用性:界面优化、帮助系统。
预览时标签不可点
Close
更多
Name cleared
微信扫一扫赞赏作者
Like the AuthorOther Amount
赞赏后展示我的头像
作品
暂无作品
Like the Author
Other Amount
¥
最低赞赏 ¥0
OK
Back
Other Amount
更多
赞赏金额
¥
最低赞赏 ¥0
1
2
3
4
5
6
7
8
9
0
.
二手架构师杂谈 · 目录
二手架构师杂谈
上一篇软考高级系统架构设计师知识精要-系统建模与UML设计下一篇软考高级系统架构设计师知识精要-软件测试与运行维护
Close
更多
搜索「」网络结果
Close
调整当前正文文字大小
更多
100%