# 软件架构师 **Repository Path**: qfeilong/software-architect ## Basic Information - **Project Name**: 软件架构师 - **Description**: 软件架构师笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-10 - **Last Updated**: 2025-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README flynn 分类

flynn 分类

S:单 M:多

结构 控制部分 处理器 主存块 关键性 代表
SISD 单个 单个 一个 单处理系器统
SIMD 单个 多个 多个 各处理器以异步的形式执行同一条指令 并行处理机、阵列处理机、超级向量处理机
MISD 多个 一个 多个 不存在
MIMD 多个 多个 多个 能够实现作业任务、指令等各级全面同步 多处理机系统、多计算机

CISC(复杂) 和 RISC(简单)

CISC:

  1. 指令数量多,使用频率差别大,可边长格式;
  2. 支持多种寻址方式
  3. 微程序控制技术实现
  4. 研发周期长

RISC:

  1. 指令数量少,使用频率接近,定长格式
  2. 寻址方式少
  3. 通过增加通用寄存器,硬布线逻辑控制为主,适合采用流水线
  4. 优化编译,有效支持高级语言

层次化存储结构

快到慢:CPU -> Cache -> 内存(主存) -> 外存(硬盘)

磁盘

系统配置和性能

阿姆达尔解决方案:性能提升倍数,可以通过假设解题。

进程管理

  1. 三态
   进行
  //   \
就绪 —— 等待

就绪:所有资源就绪,就差分配CPU
运行:所有资源就绪,且分配CPU
等待:等待某个资源。
  1. 五态
   创建 ——> 就绪 ⇄ 运行 ——> 终止
             ↖     ↙
               阻塞

就绪状态 -> 运行状态:根据系统的调度算法,处于就绪状态的进程获取到处理机资源(分派的时间片)。
运行状态 -> 就绪状态:
  1.处于运行状态的进程用完了系统分配给它的执行时间片,需要让出处理机。
  2.在可剥夺的OS中,当有更高优先级的进程就绪,调度算法会让更高优先级的进程先执行。
运行状态 -> 阻塞状态:当进程等待某一事件发生时,就会从运行状态切换到阻塞状态。
阻塞状态 -> 就绪状态:当进程等待的事件已经发生,就会从运行状态切换到就绪状态。
  1. 前驱图:用于描述所有活动执行的先后顺序的约束关系

  2. 进程的同步和互斥

  1. 进程的 PV 操作 临界资源:进程间需要互斥方式对其进程进行共享的资源 临界区:每个进程中访问临界资源的那段代码称为临界区 信号量:是一种特殊的变量
  1. 进程的死锁问题 死锁的四大条件:互斥、保持和等待、环路等待、不剥夺。 银行家算法:分配资源前先评估该资源是否能收回,且不会发生死锁。

存储管理

  1. 页式存储组织:把程序等分成一定大小的页块。
页号 页内地址
页号和块号不一定相同 逻辑地址和物理地址的页内地址是相同的,页面大小可以推出页内地址,例如 4k 大小,4k=2^12^,则页内地址是 12 位,高于 12 位则为页号;块号+页内地址=物理地址
  1. 段式存储组织:
  2. 段页式存储组织:
  3. 快表
  4. 页面置换算法
方式 描述
最优算法 OPT
随机算法
先进先出算法 FIFO
最近最少使用算法 LRU

文件管理

  1. 索引文件结构 (1)直接索引:存储物理盘块 (2)一级间接索引 (3)二级间接索引 (4)三级间接索引

操作系统

  1. 文件和树型目录结构 文件属性:R 只读文件属性、A 存档属性、S 系统文件、H 隐藏文件 文件名的组成:驱动器号、路径、主文件名、拓展名

  2. 空闲存储空间的管理 空闲区表法 空闲链表法 位示图法 成组连接法

设备管理

  1. 数据传输方式:
   程序控制方式
   程序中断方式
   DMA 方式
   通道
   输入输出处理机

数据库系统

  1. 三级模式 — 两级映射
   外模式 (用户视图,可以有多个外模式)
      |
外模式-概念模式映射
      |
   概念模式
      |
概念模式-内模式映射
      |
   内模式(一个数据库只有一个内模式)
      |
   操作系统
      |
   物理数据库
  1. 数据库设计过程 需求分析(数据流图、数据字典、需求说明书) —> 概念结构设计(ER 模型) —> 逻辑结构设计(表结构设计、E-R 图转换为关系模式、规范、完整性约束、确定用户视图)—> 物理设计

  2. ER 模型 实体—联系—属性;联系一般写在 1 的一边。

    ER 图冲突分为: 属性冲突:包括属性域冲突和属性取值冲突。 命名冲突:包括同名异义和异名同义。 结构冲突:包括同一对象在不同应用中具有不同的抽象,以及同一实体在不同局部 E-R 图中所包含的属性个数和属性排列次序不完全相同。

  3. 关系代数操作

   并:合并所有 S1US2
   交:取公共部分 S1∩S2
   差:取我有的你没有的 S1-S2
   笛卡尔积:S1xS2 保留所有字段和数据,数据条数 n = n1xn2
   投影:π(1,2)S1 投影选择列
   选择:σ(1=sno1)S1 选择行
   联接:S1∞S2 字段重复只保留一份,自然联接默认取两表共同字段进行等值连接
  1. 函数依赖
y=x^2 x每个值推出唯一的y值,则x决定y或称y函数依赖于x; y的值不能推出唯一x的值,则y不能决定x;
主属性:候选键包含的属性
第一范式 (属性值都是不可拆分原子)
                    |
第二范式 (消除非主属性对候选键的部分依赖) 非主属性完全依赖候选键,不存在部分依赖,单属性主键必满足第二范式
                    |
第三范式 (消除非主属性对候选键的传递依赖)
                    |
BCNF范式 (消除主属性对候选键的传递依赖)所有函数依赖左边部分必须为候选键
  1. 规范化理论的价值与与用途
1.非规范化的关系模式,可能存在的问题包括:数据冗余、更新异常、插入异常、删除异常;规范化理论可以解决这些问题。
2.规范化理论存在问题:拆分表过多,查询效率下降.
3.规范化的键:
超键:唯一标识元组,可能存在冗余
候选键:消除超键冗余,可存在多个
主键:只能设置一个
外键:别的关系的主键
4.关系代数式转成图示表达,找出入度为零的节点,尝试遍历所有节点,如果可遍历则为候选键。
  1. 反规范化方式: 提高查询效率
1.增加派生性冗余列
2.增加冗余列
3.重新组表
4.分割表
  1. 数据库并发控制
事务:
1.原子性:
2.一致性:
3.隔离性:事务相互隔离,互不影响
4.持续性:事务结果是持续影响的

并发存在的问题:
1.丢失更新
2.不可重复
3.读"脏"数据

事务锁:
X锁: 读锁,读锁可以加其他锁
S锁: 写锁,写锁不能加其他锁

计算机网络 7 层模型

7.应用层:实现具体的应用功能
6.表示层:数据的格式与表达、加密、压缩
5.会话层:建立、管理和终止会话
4.传输层:端到端,TCP和UDP
3.网络层:分组传输和路由控制;交换机、路由器
2.数据库链路层:以贞为传输单位;网桥、交换机、网卡
1.物理层:以二进制传输;中继器(放大信息)、集线器(多条输入路线)

其他:
TCP/IP协议族:http、FTP、telnet、SMTP、POP3
UDP协议族:SNMP、DHCP、TFTP、DNS

DHCP:动态分配IP
当IP地址为169.254.x.x或0.0.0.0,有可能是DHCP服务器故障或连接不上DHCP

DNS:
本地域名服务器
根域名服务器
顶级域名服务器
权限域名服务器

查询方式:
迭代查询:效率比价高,主要采用方式
递归查询:刨根究底,效率低

网络存储技术 RAID

概念:独立磁盘冗余阵列。RAID 系统由两个或多个并行工作的驱动器组成,这些可以是硬盘或者 SSD(固态硬盘)。

RAID0:基于数据条带化,数据流被分成多个段或块,每个块都存储在不同的磁盘上;性能最高,并行处理,无冗余,破坏无法恢复。
RAID1:使用数据镜像的概念,数据被镜像或克隆到一组相同的磁盘,这样如果其中一个磁盘出现故障,可以使用另一个;可修复,利用率只有50%。
RAID0+1: RAID0 和 RAID1长处结合,高效可靠。
RAID1+0: RAID0 和 RAID1长处结合,高效可靠。
RAID3:N+1模式,有固定校验盘,坏一个盘可恢复数据。
RAID5:N+1模式,无固定校验盘,坏一个盘可恢复数据。
RAID6:N+2模式,无固定校验盘,坏两个盘可恢复。

IPV6

IPV6 地址长度为 128 位,地址空间增大了 2^96^倍。

物联网的概念与分层

概念:物联网是实现物物相连的互联网。 分层:

  1. 感知层: 识别物体、采集信息,例如二维码、摄像头、传感器
  2. 网络层: 传递信息和处理信息
  3. 应用层: 解决信息处理和人机交互的问题

云计算的概念

概念:云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。云其实是网络。
特点:
1. 集合了大量计算机,规模达到成千上万
2. 多种软硬件技术相结合
3. 对客户设备的要求低
4. 规模化效应
应用:
1. 存储服务
2. 搜索
3. 科学计算
4. 安全应用
5. 软件即服务

软件即服务(SaaS)
平台即服务(PaaS)
基础设施即服务(IaaS)

信息系统战略规划

  1. 以数据处理为核心,围绕职能部门的需求。
  2. 以企业内部 MIS 为核心,围绕企业整体需求。
  3. 以集成为核心,围绕企业战略需求。

政府信息化与电子政务

  1. 政府对政府(G2G)
  2. 政府对企业(G2B)
  3. 政府对公众(G2C)
  4. 政府对公务员(G2E)

ERP 、CRM、SCM

电子数据交换(EDI) 发展历程:电报 -> 传真 -> EDI

企业应用集成

  1. 表示集成(页面集成)
  2. 数据集成
  3. 控制集成(应用集成、API 集成)
  4. 业务流程集成(过程集成)

另一种分类:

  1. 消息集成:适用于数据量小、但要求频繁地、立即地、异步地数据交换场合。
  2. 共享数据库:实时性强、可以频繁交互、数据交互属于同步。
  3. 文件传输:适用数据量大、但交换次数少

电子商务

4 流 模式
信息流 企业对消费者(B2C)
资金流 企业对企业(B2B)
物流 消费者对消费者(C2C)
商流

信息系统开发方法

alt text

软件开发流程

软件需求分析 -> 软件设计 -> 软件编码 -> 软件测试 -> 软件维护

各阶段的对应图 需求分析阶段:数据流图。 概要设计阶段:模块结构图、层次图和 HIPO 图。 详细设计阶段:程序流程图、伪代码、盒图。

软件开发模型

1. 瀑布模型:结构化方法,需求明确或二次开发
2. 原型模型:迭代方法,快速获取需求,需求不明确。
3. 增量模型(RAD):迭代方法,开始时不用投入大量人力资源,可以事先推出核心产品以稳定用户,可以有计划的管理技术风险。
4. 螺旋模型:迭代方法,以原型为基础沿螺线旋转、每转一圈都经过计划/风险分析/实施/评估等过程且得到相应新版本、经过若干次螺旋上升得到最终版本。
5. V 模型:开发与测试结合。
6. 喷泉模型:面向对象方法,复用好;喷泉模型是一种以用户需求为动力,以对象为驱动的模型,主要用于描述面向对象的软件开发过程。该模型认为软件开发过程自下而上周期的各阶段是相互重叠和多次反复的,就像水喷上去又可以落下来,类似一个喷泉。
7. 统一过程(RUP):用例驱动,以构建为中心叠代和开发。
8. 敏捷开发: 强调人与人之间的沟通,轻文档(弱化文档,但不是不需要文档),客户需要全程参与,需求可以的变化。

逆向工程

现有系统 -> 逆向工程 -> 考虑新需求 -> 正向工程 -> 新系统 逆向工程:

  1. 设计模式(实现级)
  2. 程序和数据结构信息(结构级)
  3. 对象模型、数据和控制模型(功能级)
  4. UML 状态图和部署图(领域级)

需求工程

UML

是统一建模语言的简称,它是一种由一整套图表组成的标准化建模语言。 结构图

  1. 类图
  2. 组件图
  3. 部署图
  4. 对象图
  5. 包图
  6. 组合结构图
  7. 构建图

行为图

  1. 用例图
  2. 顺序图/序列图
  3. 通信图/协作图
  4. 定时图
  5. 状态图
  6. 活动图
  7. 交互概览图

用例泛化、包含、拓展关系:

  1. 子例是父例的一种,父例 <—— 子例
  2. 表示一个用例(基础用例)必须依赖 另一个用例(被包含用例)才能完成其功能,属于 强依赖关系。 基础用例 ──────> 被包含用例(虚线箭头 + <<include>>
  3. 表示一个用例(扩展用例)在特定条件下 增强另一个用例(基础用例)的行为,属于 可选依赖关系。基础用例 <────── 扩展用例 (虚线箭头 + <<extend>>

需求分类与需求获取

alt text

需求分析

  1. 行为模型: 状态转换图
  2. 功能模型: 数据流图 DFD
  3. 数据模型: E-R 图

数据流图 数据流:数据流向。 加工:有输入就有输出。 数据存储:例如:数据库表、文件等 外部实体:系统之外

数据流图常见异常:

  1. 黑洞:只有输入没输出
  2. 白洞:只有输入没输入
  3. 灰洞:输入不足以产生输出
  4. 父图与子图不匹配
  5. 数据存储之间的直接数据流
  6. 外部实体之间的直接数据流
  7. 外部实体与数据存储之间的直接数据流

人机界面设计

原则:

  1. 置于用户控制之下。
  2. 减少用户的记忆负担。
  3. 保持界面一致性。

结构化设计

基本原则

概要设计和详细设计
1. 自顶向下,逐步求精
2. 信息隐蔽
3. 模块独立(高内聚、低耦合)

保持模块大小适中
尽可能调用的的深度
多扇入,少扇出
单入口,单出口
模块的作用域在模块之内
功能模块应该是可预测的

需求分析阶段:数据流图

内聚与耦合 alt text

系统设计

面向对象设计

面向对象开发方法

  1. Booch 方法:功能分解
  2. Coad 方法:类和类层次结构特征
  3. OMT 方法: 对象建模
  4. UML: 统计建模语言 UML

设计原则

  1. 单一职责:设计目的单一的类
  2. 开放-封闭:对外开放,对修改封闭
  3. 李氏替换原则:子类可以替换父类
  4. 依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程
  5. 接口隔离原则:使用多个专门的接口比单一的总接口要好
  6. 组合重用原则:尽量使用组合,而不是继承关系达到重用目的
  7. 迪米特原则(最少知识法则):一个对象应该对其他对象有尽可能少的了解

设计模式

alt text

创建型模式

alt 设计模式分类

结构型模式

alt 结构型模式

行为型模式

alt 行为型模式

创建型设计模式:描述对象如何创建,是为了将对象的创建与使用分离。包括五种:单例、原型、工厂方法、抽象工厂、构建器。 结构型模式:描述类或对象如何组织成更大结构,包括 7 种:代理、适配器、桥接、装饰、外观、享元、组合。 行为型模式:描述类或对象之间如何协作完成任务,包括 11 种:模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器。

软件测试

测试原则:

  1. 尽早,不断的进行测试
  2. 程序员避免测试自己设计的程序
  3. 既要选择有效,合理的数据,也要选择无效,不合理的数据
  4. 修改后进行回归测试
  5. 尚未发现的错误数量与该程序已发现错误数成正比

测试方法:

  1. 黑合测试(不知道内部结构)
等价类划分
边界值分析
错误推测
因果图
  1. 白合测试(已知内部结构)
基本路径测试
循环覆盖测试
逻辑覆盖测试

1. 语句覆盖(覆盖程度最低)
2. 判定覆盖
3. 条件覆盖
4. 条件判断覆盖
5. 修正的条件判断覆盖
6. 条件组合覆盖
7. 点覆盖
8. 边覆盖
9. 路径覆盖(覆盖程度最高)
  1. 灰盒测试:灰盒测试结合了黑盒测试和白盒测试的特点。

软件维护

  1. 可维护性
易分析性
易改变性
稳定性
易测试性
  1. 维护类型
改正性维护: 出现错误后纠正,叫做更正性维护。
适应性维护: 环境发生变化。若环境没发生改变,而对系统做出的改进不是适应性维护。
完善性维护: 基于用户对软件完善。
预防性维护: 预防,也就是说,目前尚可工作,为了预防而做出改变。

软件过程改进-CMMI

alt CMMI

时间管理

网络图 PDM

ES 持续时间 EF
活动编号
LS 总时差 LF

风险管理

风险特性
  1. 风险存在的客观性和普遍性
  2. 某一具体风险发生的偶然性和大量风险发生的必然性
  3. 风险的可变性
  4. 风险的多样性和多层次性
  5. 基本属性:随机性和相对性
风险分类
  1. 项目风险
    1. 潜在的预算、进度、人员组织、资源、用户和需要问题
    2. 项目复杂性、规模和结构的不确定
  2. 技术风险
  3. 商业风险
    1. 市场风险、策略风险、销售风险、管理风险、预算风险

软件架构

软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构件的描述、构件的相互作用、指导构件集成的模式以及这些模式的约束组成。

软件架构风格
  1. 数据流风格:批处理序列、管道-过滤
  2. 调用/返回风格:主程序/子程序、面向对象、层次结构
  3. 独立构建风格:进程通信、事件驱动系统(隐式调用)
  4. 虚拟机风格:解释器、基于规则的系统
  5. 仓库风格(数据共享):数据库系统、超文本系统、黑板系统、数据共享
  6. C2 风格:层次网络
数据流风格:以数据流动为主。
1. 批处理序列:构件为一系列固定的计算单元,构件之间只通过数据传递交互,每个处理步骤是个独立的程序,每一步必须在其前一步结束后才开始,数据必须是完整的,以整体的方式传递。
2. 管道-过滤器:不要求不前一步完成。

调用/返回风格:
1. 主程序/子程序:程序之间调用
2. 面向对象:显示调用,对象之间相互调用
3. 层次结构:层层间调用,上层调用下层

独立构建风格
1. 进程通信:独立构建
2. 事件驱动系统:隐式调用,注册事件,触发或广播触发

虚拟机风格
1. 解释器:
2. 基于规则的系统:

仓库风格(以数据为中心)
1. 数据库系统
2. 黑板系统
3. 超文本系统

两层 C/S 架构 (胖客户端)

alt 两层CS架构

  1. 表示层:数据输入、用户交互、业务处理都在客户端 客户端程序设计复杂

  2. 数据层:存储数据

三层 C/S 架构 (瘦客户端)

alt 三层CS架构

  1. 表示层:数据输入
  2. 功能层: 业务处理(应用服务器)
  3. 数据层:数据输出(数据库服务器)

B/S 架构 (零客户端)

混合架构

富互联网应用(RIA)

在 B/S 基础上结合一些技术(例如 AJAX、Flash)增强交互性和反应速度。

例如:AJAX、Flash

SOA 基于服务的架构(重要知识点)

服务是一种为了满足某项业务需求的操作、规则等的逻辑组合,它包含一系列有序活动的交互,为实现用户目标提供支持。 优点:

  1. 基于高度统一的标准
  2. 松散偶合
  3. 粗粒度

实现方式:

  1. Web Service: 服务提供者、服务注册中心、服务请求者
  2. ESB(企业服务总线):将多种服务挂接在服务总线上,通过总线可以获取服务信息和发送信息

软件架构评估

质量属性(案例常考):

运行期质量属性 性能 定义: 系统在处理请求时所需的时间(响应时间)和单位时间内能处理的请求数量(吞吐量)。 措施

  1. 减少处理时间:使用更高效的算法和数据结构。
  2. 增加并发:采用多线程、异步处理(如消息队列)来并行处理任务,避免阻塞。
  3. 缓存:引入各级缓存(CPU 缓存、内存缓存、分布式缓存如 Redis),减少对数据库等慢速资源的访问。
  4. 资源池:使用数据库连接池、线程池,避免频繁创建和销毁资源的开销。
  5. 批处理:将多个小操作合并为一个批量操作,减少 I/O 次数。
  6. 内容分发网络 (CDN):将静态资源分发到离用户更近的节点,加快加载速度。

可用性 定义:系统在特定时间段内可正常提供服务的时间比例,常以“几个 9”来衡量(如 99.99%)。 措施

  1. 冗余/消除单点故障 (SPOF):对关键组件(服务器、数据库、网络交换机)做集群部署,一台宕机,其他可接管。
  2. 故障转移 (Failover):通过心跳机制监控节点状态,发生故障时自动切换到备用系统。
  3. 负载均衡:将流量分发到多个服务器实例,避免单个实例过载,并隐藏某个实例的故障。
  4. 优雅降级:在系统压力过大或部分功能故障时,保证核心功能依然可用(如购物网站下单功能不可用时,至少用户可以浏览商品)。
  5. 健康检查和自愈:系统能自动检测故障并尝试重启或修复。

可伸缩性 定义:系统通过增加资源来应对负载增长的能力。 措施

  1. 水平伸缩 (Scale-out):通过增加更多的机器来分散负载。这是云时代的首选方案,通常需要无状态设计(将用户状态保存在外部存储如 Redis 中,而不是服务器内存里),这样任何请求都可以被任何服务器处理。
  2. 垂直伸缩 (Scale-up):通过增加单台机器的资源(CPU、内存)来提升处理能力。有物理上限,通常用于特定场景。
  3. 数据分片 (Sharding):将数据库中的数据按某种规则(如用户 ID)分散到多个数据库中,以解决单库的存储和性能瓶颈。
  4. 使用消息队列解耦:将突发流量缓冲在消息队列中,后端服务按自己的能力消费,平滑处理峰值负载。

安全性 定义:系统保护自身数据和资源免受未授权访问、修改和破坏的能力。 措施

  1. 纵深防御:在系统的各个层面(网络、主机、应用、数据)实施安全措施。
  2. 身份认证与授权:使用强身份认证(如 OAuth 2.0, OpenID Connect)和细粒度的授权机制(如 RBAC)。
  3. 加密:对传输中的数据(TLS/SSL)和静态数据(数据库加密)进行加密。
  4. 最小权限原则:每个组件或用户只拥有完成其任务所必需的最小权限。
  5. 输入验证与输出转义:防止 SQL 注入、XSS 等常见攻击。
  6. 安全审计与日志:记录所有安全相关操作,便于追踪和审计。

可维护性 定义:系统易于修改和修复缺陷的能力。这虽然也是开发期属性,但修改的动机往往来自运行期。 措施

  1. 模块化与低耦合:将系统划分为职责单一、接口明确的模块,修改一个模块不影响其他模块。
  2. 遵循设计原则:应用 SOLID、DRY 等设计原则,编写清晰、可读的代码。
  3. 全面的文档和注释:为代码和架构决策提供清晰的说明。
  4. 自动化测试:建立完善的测试套件(单元测试、集成测试),确保修改不会引入新的错误。

互操作性:与其它系统协同工作或交换信息的能力。

可靠性 定义:系统在指定条件下无故障运行的能力(注意区分可用性)。 措施

MTBF(Mean Time Between Failures):平均故障间隔时间,是系统在两个故障之间的平均正常运行时间。
MTTD(Mean Time to Detect):平均故障检测时间,是检测到故障所需的平均时间。
MTTR(Mean Time to Repair):平均修复时间,是修复故障所需的平均时间。
MTBR(Mean Time Between Repairs):平均修复间隔时间,是修复后到再次发生故障的平均时间。

易用性:用户学习、操作、准备输入和理解输出的容易程度。 健壮性:在出现故障(硬件、软件、网络)时保持服务的能力。

开发期质量属性

可测试性 定义:软件能够被容易且有效地进行测试的程度。 措施

  1. 依赖注入 (DI):通过构造函数或接口注入依赖,便于在测试时用 Mock 或 Stub 替换真实依赖(如数据库、第三方服务)。
  2. 清晰的接口和契约:模块有定义良好的输入和输出,便于构建测试用例。
  3. 分层架构:将业务逻辑与 UI、数据访问分离,可以单独测试核心业务逻辑。
  4. 日志和监控:提供足够的内部状态可见性,帮助定位测试中发现的问题。

可扩展性 / 灵活性 定义:系统能够容易地添加新功能或修改现有功能,而无需大幅修改现有代码。 措施

  1. 面向接口编程:依赖于抽象(接口)而非具体实现,未来可以轻松替换或添加新的实现。
  2. 插件化架构:定义标准的插件接口,新功能可以作为插件动态加载。
  3. 微内核架构:有一个核心系统,其他功能作为外部组件添加。
  4. 使用设计模式:如策略模式、观察者模式等,使系统行为易于变更和扩展。

可移植性 定义:软件能够从一个环境迁移到另一个环境(不同操作系统、云平台、数据库)的难易程度。 措施

  1. 抽象外部依赖:将对操作系统、数据库等特定技术的调用封装在统一的接口后面。例如,使用 ORM 来抽象数据库差异。
  2. 遵循标准:使用行业标准协议(如 HTTP, SQL)和中间件,避免使用特定厂商的私有特性。
  3. 配置化:将与环境相关的信息(如数据库连接字符串、API 端点)提取到配置文件中,而不是硬编码在代码里。

可复用性 定义:系统的模块或组件能够在其他项目中重复使用的程度。 措施

  1. 高内聚、低耦合:组件功能完整且独立,不依赖外部特定上下文。
  2. 组件库/服务化:将通用功能打包成独立的库(如 JAR 包、NPM 包)或微服务。
  3. 定义清晰的 API:提供稳定、文档完善的接口

评估方法

基于调查问卷 基于度量方式 基于场景的方式(常用)

敏感点:变化对结果造成较大的影响,强调重要影响。 权衡点:会影响到多质量属性,强调多质量属性。 风险点:潜在危险(还未发生,可能会发生),需防范管理。 非风险点:影响较小,不需特别关注。

基于场景的评估方法

  1. 架构权衡分析法(ATAM): 描述 ATAM 方法->描述业务动机->描述架构->确认架构方法->生成质量属性用例树->分析架构方法->

  2. 软件架构分析法(SAAM): 针对最终架构而非详细设计进行评估。SAAM 的评估过程包括:场景开发、架构描述、单场景评估、场景交互评估和总体评估。

  3. 成本效益分析法(CBAM) 是一种在软件架构评估领域中具有重要价值的方法,它从经济视角出发,致力于构建包含成本、收益、风险和进度等多方面要素的软件经济模型 。

  4. 软件架构静态分析方法(SASAM)

信息安全 5 个要素

1. 机密性:确保信息不暴露给未授权的实体或进程。
2. 完整性:只有得到允许的人才能修改数据,并且能够判别出数据是否已被篡改。
3. 可用性:得到授权的实体在需要时可访问数据,即攻击者不能占用所有的资源而阻碍授权者的工作。
4. 可控性:可以控制授权范围内的信息流向及行为方式。
5. 可审查性(不可否认性):对出现的信息安全问题提供调查的依据和手段。

计算机安全五个等级

第一级:用户自主保护级
第二级:系统审计保护级
第三级:安全标记保护级
第四级:结构化保护级
第五级:访问验证保护级。

净室软件工程

概念:净室软件工程(Cleanroom Software Engineering,CSE)是一种应用数学与统计学理论,以经济的方式生产高质量软件的工程技术。其核心思想是在软件开发过程中,通过严格的工程化过程,力图达到开发中的零缺陷或接近零缺陷。

步骤:

  1. 需求分析
  2. 形式化规范
  3. 增量开发
  4. 证明正确性
  5. 统计质量控制

技术手段:

  1. 增量式开发:将整个开发过程划分为一系列较小的累积增量。
  2. 基于函数的规范、设计:盒子结构方法按照函数理论定义了三种抽象层次:行为视图、有限状态机视图和过程视图。
  3. 正确性验证:通过基于函数理论的推理来验证设计的正确性。
  4. 统计测试和软件认可:采用统计学的基本原理,通过使用模型产生测试用例。

构件组装

概念:构件组装是指构件相互直接集成或是用专门编写的“胶水代码”将它们整合在一起来创造一个系统或另一个构件的过程 方式:顺序组装、层次组装、叠加组装 接口不兼容问题:

  1. 参数不兼容:接口操作有相同的名字,但参数类型和参数个数不同
  2. 操作不兼容:提供接口和请求接口的操作名不一样
  3. 操作不完备:一个构件的提供接口是另一个构件请求接口的一个子集,或者相反。

分布式计算架构

分布式表示架构: 表示层和表示逻辑层在客户机,逻辑层、数据处理层,数据层在服务器。 分布式数据架构: 表示层和表示逻辑层、逻辑层在主机,数据处理层,数据层在服务器。 分布式数据和应用架构: 表示层和表示逻辑层在客户机,逻辑层在应用服务器,数据处理层,数据层在服务器。

分布式数据库

4 种透明性

  1. 分片透明:用户不必关心数据如何分片
  2. 复制透明:它关注的是数据的冗余副本,用户无需知道数据存在多少个副本。
  3. 位置透明:它关注的是数据的物理存储位置,用户无需知道数据具体存储在哪个网络节点上。
  4. 逻辑透明:它关注的是底层数据模型的异构性。

嵌入式系统

特点

  1. 系统内存小
  2. 专用性强
  3. 系统精简
  4. 高实时性
  5. 多任务的操作系统
  6. 需要开发工具和环境

多模型数据库

概念:多模型数据库(Multi-Model Database, MMDB)是一种能够同时支持多种数据模型(如关系模型、文档模型、键值模型、图模型等)的数据库系统。这种设计使得数据库能够灵活适应不同应用场景下的数据处理需求,提高数据管理的效率和灵活性。

为什么要使用多模型数据库,解决什么痛点: 在多模型数据库出现之前,企业通常使用“多语言持久化”架构来解决复杂的数据需求。

核心优势:

  1. 简化架构:“一个数据库,多种模型”。极大降低了运维复杂度和成本。
  2. 高效性:通过优化不同数据模型的存储和查询算法,多模型数据库能够显著提高数据处理效率
  3. 一致性和可靠性:由于所有数据都在一个引擎内,可以对跨越不同模型的操作提供 ACID 事务保证。
  4. 消除数据冗余与延迟:一份数据,可以用多种模型来访问。例如,存储为一个文档的数据,也可以被当作图中的一个节点来查询,无需复制和同步。
  5. 降低学习成本:虽然可能需要学习新的查询方式,但所有操作都在一个统一的平台内,通常有一种主导的查询语言(如 SQL 的扩展)来操作所有模型。

负载均衡

概念 负载均衡是一种技术策略,其核心目标是将网络请求或数据流量智能地、均匀地分发到多个后端服务器上,以确保:

  1. 任何单一服务器都不会过载,从而避免单点性能瓶颈。
  2. 所有服务器的资源都能得到充分利用,从而提升整体系统的吞吐量和效率。
  3. 提高系统的可用性和容错性,当某个服务器发生故障时,负载均衡器能够将流量导向健康的服务器。

作用

  1. 应对高流量(Scalability - 扩展性):单个服务器处理能力有限
  2. 提高可用性(Availability - 可用性):多台服务器构成集群后,即使其中一两台宕机,仅受到微小影响。
  3. 实现可维护性(Maintainability):可以在不影响用户访问的情况下,对后台服务器进行平滑升级、打补丁或下线维护。
  4. 提升性能(Performance):将请求分发到离用户更近(地理上或网络上)的服务器,可以减少延迟,提升用户体验。

实现:通过 Ngginx 搭建负载均衡服务器

微服务

概念 微服务架构是一种将单个应用程序作为一套小型服务集合来开发的方法,每个服务运行在独立的进程中,并通过轻量级的通信机制(通常是 HTTP/REST API)进行交互。 每个服务都围绕着具体的业务能力构建,并且可以独立部署、升级和扩展。

核心特性与优势

  1. 单一职责:每个微服务只关注一个特定的业务功能,做到高内聚、低耦合。
  2. 独立部署:这是微服务最大的价值之一。
  3. 技术多样性:不同的服务选择最合适的技术栈,每个服务有拥有自己的私有数据库。
  4. 弹性与容错:通过熔断、降级、超时等机制,一个服务的故障不会像雪崩一样传递到整个系统。
  5. 可扩展性:可以根据每个服务的负载情况进行精细化的扩展。

带来挑战

  1. 并非所有的系统都能转成微服务。
  2. 部署较单体架构更加复杂:系统由众多微服务搭建,每个微服务需要单独部署,从而增加部署的复杂度,容器技术能够解决这一问题。
  3. 性能问题:由于微服务注重独立性,互相通信时只能通过标准接口,可能产生延迟或调用出错。
  4. 数据一致性问题:作为分布式部署的微服务,在保持数据一致性方面需要比传统架构更加困难。

流程

  1. 为什么拆:必须明确业务痛点。是因为单体应用臃肿,无法快速迭代?还是因为某个模块压力大,需要独立伸缩?或是团队协作效率低下? 拆后效果:部署率提升 10 倍,核心服务可用性可达 99.9%

  2. 怎么拆:推荐使用 领域驱动设计(DDD) 作为方法论。

  3. 架构设计,以 Spring Cloud Alibaba 作为核心技术体系(例如智慧电商平台)

    1. 客户端层:Web、Mobile、App。
    2. API 网关层:Spring Cloud Gateway,标注认证、限流、日志。
    3. 微服务层:用户服务、商品服务、订单服务、库存服务等,每个服务连接自己独立的数据库。
    4. 通用组件层:Nacos(注册/配置中心、服务间调用)、Sentinel(熔断降级)、RocketMQ(消息队列)。
    5. 基础设施层:Docker + Kubernetes,表示容器化部署。
  4. 技术选型与核心组件

    1. 服务治理:选用 Nacos 作为服务注册与发现中心,其健康检查和动态配置管理能力简化了我们的技术栈。
    2. API 网关:采用 Spring Cloud Gateway,作为系统唯一入口,统一处理路由转发、JWT 认证、全局限流与跨域请求。
    3. 服务通信:服务间同步调用采用 OpenFeign 声明式 REST 客户端;为保障最终一致性,异步解耦使用 RocketMQ 消息队列。
    4. 容错与流控:集成 Sentinel,在网关和各个微服务中配置流控、熔断和系统自适应保护规则,确保核心业务在洪峰流量下的稳定性。
    5. 安全与认证:在网关层集成 OAuth 2.0 协议,使用 JWT 令牌作为无状态认证凭证,实现了安全的单点登录。
  5. 难点

    1. 分布式环境下的数据一致性保障:“基于消息的最终一致性”方案,并辅以 TCC 模式应对高价值场景,RocketMQ。
    2. 部署复杂性:搭建基于 Jenkins 和 Kubernetes 的 CI/CD 流水线,实现了微服务的自动化部署与滚动更新。
    3. 微服务链路复杂性导致故障定位困难: 引入了 SkyWalking 作为应用性能管理(APM)工具,构建三位一体的可观测性体系。在所有微服务中集成 SkyWalking Agent,自动采集并上报链路数据。
  6. 架构图 alt 微服务架构

云原生架构

核心概念 云原生是一种构建和运行应用程序的方法论,它基于云计算的分布式、弹性、可扩展特性,旨在充分利用云的优势,在新型动态环境(如公有云、私有云和混合云)中,构建和运行可弹性扩展、容错性好、易于管理、便于观察的应用。 可以把它理解为一个指导思想,其最终目标是以更快的速度、更低的成本,交付高质量、高可用的软件。

四大核心要素

核心要素 核心思想 关键技术代表 解决的问题
容器化 将应用及其所有依赖(库、配置文件等)打包成一个标准化的、轻量的、可移植的运行时单元。 Docker 环境一致性、隔离性、轻量级、简化交付。
动态管理 自动化地部署、管理、扩展容器化应用,提供故障自愈、服务发现、负载均衡等能力。 Kubernetes 运维自动化、高可用、弹性伸缩、资源调度。
微服务 将单体应用拆解为一组小型、松散耦合、围绕业务能力构建的服务。 Spring Cloud, Go Kit, Dubbo 等 敏捷开发与交付、技术异构性、独立伸缩。
DevOps + 持续交付 一种文化与实践,通过自动化工具链,促进开发与运维团队的协作,实现软件的频繁、可靠发布。 Jenkins, GitLab CI, ArgoCD 缩短交付周期、提升软件质量、降低发布风险。

架构优势

  1. 高弹性与可扩展性:能够根据负载自动伸缩,轻松应对流量高峰,节省空闲时的资源成本。
  2. 快速交付与迭代:容器化和 DevOps 文化使得应用可以频繁、可预测、低风险地发布。
  3. 高可用与容错性:服务实例故障可被自动检测和替换,服务网格等组件提供了强大的容错机制。
  4. 资源利用率高:容器比传统虚拟机更轻量,Kubernetes 的调度能力可以“见缝插针”地部署应用,最大化利用硬件资源。
  5. 技术异构性与团队自治:微服务允许不同服务使用不同的技术栈,小团队可以独立开发、部署和扩展自己的服务。

相关技术 docker:提供容器化机制,用于封装和打包应用。容器包含应用和环境,可独立部署到不同操作系统 kubernetes(掌舵者): 负责自动化容器的部署、扩展、负载均衡、故障恢复等工作,容器编排平台 服务治理 Istio 服务网格: 解决了“服务之间如何智能、可靠、安全地通信”的问题。将应用与网络解耦,Kubernetes 让你有能力运行微服务,而 Istio 让你有能力高效、可靠、安全地管理微服务之间的交互。 持续到交付层:GitOps 模式,代码提交 Git -> 触发 jenkins 流水线自动完成镜像构建、安全扫描并推送至 Harbor。随后,ArgoCD 监听镜像仓库变化,自动将应用同步部署到 K8s 集群,实现了部署过程的完全自动化和可审计。 可观测性:搭建了集成了 Prometheus(指标监控)、Grafana(数据可视化)、Loki(日志聚合)和 Jaeger(分布式追踪)的全栈监控系统,实现了对应用与基础设施的 360 度立体监控。

事件驱动架构

概念 事件驱动框架是一种通过事件的产生、传递和响应来组织和设计软件的架构模式。它的核心思想是通过事件**解耦系统中的各个组件**,使得系统更具灵活性和可扩展性。事件的发布者不知道也不关心哪些组件会处理这个事件,反之,处理者也不知道事件是谁发布的。它们只通过事件进行间接通信。

核心组件

  1. 事件:事件是系统中发生的特定事务或状态变化的表示。
  2. 发布者:负责创建和发布相应事件的组件。
  3. 订阅者:监听特定类型的事件,并在接收到事件后执行其业务逻辑的组件。
  4. 事件通道:负责从生产者那里接收事件,并将其路由到所有感兴趣的消费者。最常见的实现就是 消息代理 或 事件流平台。

实现方式

实现方式 核心思想 通信模式 关键技术举例 适用场景
消息队列 任务分发,一条消息一个消费者 点对点 RabbitMQ, SQS 异步任务、负载均衡
发布/订阅 一个事件通知所有订阅者 一对多 Redis Pub/Sub, SNS 系统解耦、一事件多响应
事件流处理 持久化的事件流,可重放 流式处理 Apache Kafka, Kinesis 实时大数据、复杂事件处理
事件源 用事件序列代表状态 状态重建 EventStoreDB, Kafka 审计、时间旅行、与 CQRS 搭配

面向服务的架构设计(SOA) 概念 面向服务的架构设计是一种将应用程序的不同功能单元(称为“服务”)通过定义良好的接口(标准高度统一)和契约联系起来,并允许这些服务在网络上进行通信的架构范式。例如通过服务化封装,一个用户认证服务可被 10+个不同系统复用。

核心原则 标准化服务契约、松耦合、服务抽象、服务可重用性、服务自治、服务无状态性、服务可发现性、服务组合性

关键组件

  1. 服务提供者:创建服务并使其在网络上可用的实体。
  2. 服务消费者:查找并调用服务提供者以完成某项任务的应用程序或服务。
  3. 服务注册中心:一个目录,服务提供者在这里发布其服务契约,服务消费者在这里查找服务。例如:UDDI。
  4. 服务契约:一份正式的定义,描述了服务的功能、如何调用它、所需的参数以及返回的结果。在 Web 服务中,这通常是 WSDL 文件。
  5. 企业服务总线:这是 SOA 架构的中枢神经系统。它是一个中间件平台,提供智能的路由、消息转换、协议转换、服务编排等功能,使得服务之间能够以统一的方式通信。

Web 服务栈 SOAP:一种基于 XML 的协议,用于在服务之间交换结构化信息。 WSDL:用于描述 Web 服务的 XML 格式,定义了服务的位置、操作和参数。 UDDI:用于注册和发现 Web 服务的目录服务。

SOA vs. 微服务架构

特性 面向服务的架构 微服务架构
核心组件 企业级可重用的服务 小型、单一职责、独立的服务
通信 通常使用重量级协议(如 SOAP/XML)和智能管道 通常使用轻量级协议(如 HTTP/REST, gRPC)和哑管道,智能端点
数据管理 通常共享全局数据库 每个服务拥有自己的私有数据库
治理 强调统一的规范和标准 更推崇去中心化的治理和技术多样性
核心中间件 企业服务总线 API 网关、服务网格
目标 企业应用集成和业务功能重用 实现敏捷开发、快速交付和高度可扩展性

机器人操作系统(ROS)

机器人操作系统(ROS):是一个开源的框架,广泛应用于机器人研究和工业领域。它并不是传统意义上的操作系统,而是一个运行在操作系统(如 Linux)上的中间件,提供了分布式通信机制和模块化开发工具,帮助开发者高效地构建机器人应用。

核心概念 ROS 的核心思想是通过节点(Node)实现功能模块化,每个节点负责特定任务,节点之间通过消息(Message)进行通信。通信方式包括话题(Topic)、服务(Service)和动作(Action)。主节点(Master)负责管理节点间的通信。 ROS 提供了硬件抽象层、设备驱动、库函数以及工具链,支持多语言开发(如 C++ 和 Python)。其模块化架构允许开发者复用功能包(Package),实现松耦合和分布式计算。

ROS1 是早期版本,支持广泛但存在实时性和安全性不足的问题。ROS2 引入了更强的实时性能、跨平台支持(包括 Windows 和 macOS)、安全性和扩展性,适合多机器人系统和大规模部署。

高频考点

  1. 架构设计模式(微服务、事件驱动、分层架构等)
  2. 非功能性需求(性能、安全、可拓展性)
  3. 原生技术(容器、Serverless、DevOps)
  4. 成本优化与风险管理
  5. 性能优化: 缓存策略(CDN、Redis)、数据库分片、负载均衡。
  6. 安全架构: 零信任模型、加密方案(TLS、KMS)、合规标准(GDPR、HIPAA)。

论文写作

  1. 摘要格式

摘要是正文的简单阐述,需要交代因素:项目背景、简单功能介绍、通过采取(技术、方法、工具、措施、手段)、总结(不足之处、特色之处、如何改进、发展趋势)、作者的工作角色(架构师师、项目经理)

  1. 正文

1. 以“我”为中心:围绕自身角色和工作
2. 站在高级工程师的高度:过程没必要写得太细
3. 忠于论点
4. 条理清晰,开门见山
5. 标新立异,要有主见
6. 图文并茂,能收到奇效
7. 首尾一次

  1. 论文不能光描述如何实现,而也是要分析为什么这样做。
  2. 常见问题

1. 跑题
2. 字数偏多,字数不够
3. 摘要缺乏归纳,缺少特色,泛泛而谈
4. 文章口语化太重,文章表达能力太差
5. 文章缺乏主题项目,项目年代久远
6. 文章结构不清晰,段落太长

论文结构格式

  1. 摘要:背景与问题、技术/方法、我的角色、成果与价值
黄金公式:本文以我与xxx年主持设计与实施“xxx”项目为背景,项目面向xxx用户提供xxx、xxx、xxx、等相关业务共功能。我在该项目中担任系统架构师,负责项目的架构设计与技术落地。本文以该项目为例,详细阐述了XXX(论文主题)的应用。项目存在的问题和挑战xxx、xxx、xxx,采用xxx技术/方法,通过xxx具体工作,最终取得了xxx(最好量化)成果。
  1. 正文 正文第一部分(项目背景与挑战)
项目背景
我的角色与职责
项目存在的核心问题和挑战
(引出主题) 为解决上述严峻挑战,经过团队多次技术论证,我们最终决定采xxx的核心指导思想。

正文第二部分(理论知识与技术选型)

阐述1引出的技术和方法的概念
为何选择(应对1中问题与挑战)

正文第三部分(具体实施过程)

总体思路与架构图
(分步骤描述 - 重点突出“我”做了什么)
1.
2.
3.
  1. 实施效果与总结展望
效果(量化)
不足点(列出1-2)
给出解决思路

论文押题

  1. 云原生架构
  2. 微服务架构
  3. 人工智能 AI 与软件架构的应用
  4. AI 运维

零散知识点

  1. 两个类似商标,同一天且都是第一次使用时,无法决定给哪家公司注册时,则采用抽签方式。
  2. 垂直重用:局限于某一垂直领域的重用,例如只在电力系统用到的构件;水平重用:通用领域的重用,如标准函数库
  3. 信息隐蔽:是软件工程中的一项核心设计原则,旨在通过隐藏模块的内部实现细节,仅暴露必要的接口。 可以提高软件的可修改性、可测试性、可移植性。
  4. 静态分析:
    1. 控制流分析阶段: 找出出口或入口
    2. 数据使用分析阶段:变量使用情况
    3. 接口分析阶段:检查子程序和过程说明及他们使用的一致性
    4. 信息流分析阶段:输入变量和输出变量之间的依赖关系
    5. 路径分析阶段:找出所有的路径并画出在此路径上的执行语句
  5. 分布式数据中的 4 种透明性从高到低
    1. 分片透明:用户不必关心数据如何分片
    2. 复制透明:它关注的是数据的冗余副本,用户无需知道数据存在多少个副本。
    3. 位置透明:它关注的是数据的物理存储位置,用户无需知道数据具体存储在哪个网络节点上。
    4. 逻辑透明:它关注的是底层数据模型的异构性。
  6. CRM 它通过将人力资源、业务流程与专业技术进行有效的整合;CRM 系统的主要模块包括销售自动化、营销自动化、客户服务与支持、商业智能。
  7. 语音识别是黑板风格的经典应用。
  8. 混成系统:混成系统一般由离散分离组件和连续组件并行或串行组成 ,组件之间的行为由计算模型进行控制.
  9. SoC 片上系统:一种技术,是一种将整个电子系统集成到单一芯片上的技术,高度集成,多核
  10. DSP:是一种专门用于高速数字信号处理的微处理器;哈佛架构、运算效率高、实时性极强
  11. 无噪声信道的最大传输速率 C=Blog2(N) = 2Wlog2(N),噪声影响 C = Wlog2(1+S/N) S=信号平均功率 N=噪声平均功率
  12. COM 支持两种形式的对象组装:包含(Containment)和 聚集(Aggregation)。
    1. 包含是一个对象拥有指向另一个对象的唯一引用。
    2. 聚集直接把内部对象接口引用传给外部对象的客户,而不是再转发请求。
  13. 软件架构复用的类型包括机会复用和系统复用。
  14. “4+1”视图模型
    1. 逻辑视图:功能抽象,分析
    2. 开发视图:模块视图,实现
    3. 进程视图:性能需求,性能
    4. 物理视图:部署视图,部署
    5. 场景视图:将其他 4 个视图有机联合
  15. 体系结构演化是使用系统演化步骤:
    1. 需求变化归类
    2. 制订体系结构演化计划
    3. 修改、增加或删除构件
    4. 更新构件的相互作用
    5. 构件组装与测试
    6. 技术评审
  16. 公钥和私钥:公钥是用来加密信息和验证数字签名的,而私钥是用来解密接收到的加密信息和创建数字签名的。给谁发就用谁的公钥加密
  17. 旧 IDE 采用“顺序批处理”架构风格,新 IDE 采用“数据共享”
  18. ABSDM 模型把整个基于体系结构的软件过程划分为:体系结构需求、设计、文档化、复审、实现和演化等 6 个过程。
  19. 向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成。设计模型则包含以包图表示的软件体系结构图、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。
  20. 软件架构设计主要关注软件构件的结构、属性和交互作用 。
  21. PGP(Pretty Good Privacy),是一个基于 RSA 公钥加密体系的邮件加密软件。可以用它对邮件保密以防止非授权者阅读。