什么是架构
[维基百科定义]:架构=要素+结构+连接
软件架构是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方⾯的设计
[IEEE定义]:架构=组件+关系+方法
架构是系统的基本结构,这种结构体现在组件内、系统彼此间的关系、系统与环境 之间的关系,以及指导系统设计与演化的原则
[概括]架构是软件系统的顶层结构
架构的目的
应对软件复杂度/管理复杂度
- 什么是复杂 
- 难以理解 
- 规模的增长(功能增多、数据增多、系统增多导致混乱、无序、边界不清晰等)
 
 - 难以预测 
- 客户需求的变化/不确定性的环境等
 
 
 - 难以理解 
 复杂的来源
输出
输出
输出
输出
- 开发架构
 - 部署架构
 - 功能需求解决方案
 - 系统建模方案
 - 非功能性需求解决方案(3高/可扩展/一致性/通用性/安全性/稳定性等)
 
架构的过程
业务架构过程(建模)
- UML建模法
输出用例模型、业务模型 8x Flow 业务建模法
ThoughtWorks中国区CTO徐昊、首席咨询师胡浩系统架构过程
理清业务架构后,把业务架构转换为系统架构的过程,是应用架构、数据架构、技术架构的统一过程
软件设计原则
- 单一职责原则 
- 任何一个软件模块、组件、类、函数只负责完成一个职责(或者功能)
 
 - 开闭原则 
- 软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭
 
 - 里氏替换原则 
- 子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏
 
 - 接口隔离原则 
- 客户端(使用者/调用者)不应该被强迫依赖它不需要的接口(一组API接口、单个API接口或函数)
 
 - 依赖反转原则 
- 软件模块应该多依赖抽象而不要依赖实现
 
 - KISS原则
Keep it Simple and Stupid- 尽量保持简单
 
 - YAGNI原则
You Ain’t Gonna Need It- 不要去设计当前用不到的功能,有设计但不能过度设计
 
 - DRY原则 
- 不要重复你自己,遵循复用性
 
 - 最小知识原则(迪米特法则)
Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.- 不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口
 
 高内聚低耦合原则
高性能
- 读写 
- 缓存系统 
- 缓存一致性(缓存与DB不一致) 
- 缓存更新策略(CacheAside)
 
 - 缓存命中率低(影响性能) 
- 提升过期时间、优化更新策略
 
 - 缓存序列化与反序列化 
- 读写需要用一致的序列化方式
 
 - 缓存击穿(热Key失效) 
- 缓存永不过期
 
 - 缓存热点(缓存节点负载过高) 
- 热Key监控、热Key切分、本地缓存
 
 - 缓存穿透(Key不存在) 
- 缓存空数据、布隆过滤器
 
 - 缓存雪崩(多Key同时失效) 
- 设置不同的过期时间、多级缓存、异步刷缓存
 
 - 缓存抖动(网络抖动) 
- 多级缓存、有限重试、冗余请求
 
 
 - 缓存一致性(缓存与DB不一致) 
 - 数据镜像 
- 数据同步(主从同步)
 - 数据一致性(一主多从)
 - 读写分离
 
 - 数据分片(分库分表) 
- 分区策略
 - 数据访问层(中间件框架/中间件代理)
 - 数据一致性
 
 - CQRS 
- 服务读写分离
 
 - NoSQL 
- 全文搜索引擎(ES)
 - 列式数据库(HBase)
 
 - 异步化 
- 线程池/Future
 - 事件溯源
 - 消息中间件
 
 - 批量 
- 批量读
 - 批量写
 
 - 负载均衡 
- DNS(地域级别均衡)
 - 硬件负载均衡(F5)
 - 四层负载均衡(LVS)
 - 七层负载均衡(Nginx)
 - 网关系统
 
 - 边缘计算 
- IOT设备(门禁系统/共享单车)
 
 
 - 缓存系统 
 - 计算 
- Reactor模式
 - 无锁数据结构
 - 单写原则
 - 面向CPU缓存行(MESI)
 
 
- 读写 
 - 高可用 
- 理论 
- CAP 
- 分布式系统只能同时满足CAP中的2个要素
 
 - BASE 
- 基本可用(Base Available)
 - 软状态(Soft State)
 - 最终一致性(Eventually Consistency)
 
 
 - CAP 
 - 业务高可用 
- 服务集群 
- 同城异区(同城多机房)
 - 跨城异地(跨城多机房)
 - 跨国异地(跨国多机房)
 
 
 - 服务集群 
 - 存储高可用 
- 数据副本 
- 主备复制(读写都走主、副本不提供服务)
 - 主从复制(主写从读、读写都走主)
 - 主主复制(异地多活架构)
 
 
 - 数据副本 
 - 服务高可用 
- 服务拆分 
- 按功能领域拆分服务
 - 按稳定服务与变化服务拆分
减少频繁变更带来的风险,提高服务可用性 - 按可靠性拆分(核心与非核心)
 
 - 服务容错 
- 幂等设计
 - 异步设计
 - 重试设计
 - 补偿设计
 - 隔离设计
 - 限流限频
 - 降级设计
 - 熔断设计
 
 
 - 服务拆分 
 
 - 理论 
 - 一致性 
- 多副本一致性/跨系统一致性 
- 缓存在一致性 
- 优化更新策略
 
 - 主从同步延迟 
- 强制读主
 
 - 异步同步 
- 轮询+接口反查
 - MQ消息+接口反查
 - 定时任务+接口反查
 
 
 - 缓存在一致性 
 - 事物一致性 
- 流程中断问题 
- 本地事物/回滚处理
 - 分布式事物/两阶段处理
 - 重试
 - 失败补偿
 - 本地消息表
 - MQ事务消息
 - 对账
 
 - 并发/重复请求问题 
- 并发锁/分布式锁
 - 幂等机制(UK/Token/状态机)
 
 - 接口/消息乱序问题 
- 状态机
 - 全局有序队列
 
 - 业务逻辑问题 
- 业务对账
 - 业务补偿
重做某业务流程、如果无法成功则进入兜底流程或应急流程。
比如先收到了下单的邮件,过一会又收到了没有库存的致歉的邮件。 
 
 - 流程中断问题 
 
 - 多副本一致性/跨系统一致性 
 - 可扩展 
- 资源可扩展(伸缩性(Scalability)
系统能够通过增加(或减少)⾃身资源规模的方式增强(或减少)自⼰计算事务的能力。在⽹站架构中,通常是指利用集群的方式增加服务器数量,从⽽提高系统的整体事务吞吐能⼒。- 水平扩展(指服务和数据的水平复制) 
- 服务无状态-扩容
 - DB一主多从
 
 - 垂直扩展(指拆分服务或数据) 
- 按领域拆分服务
 - 按功能拆分数据库
 
 
 - 水平扩展(指服务和数据的水平复制) 
 - 代码设计可扩展(Expandability)
对现有系统影响最⼩的情况下,系统功能可持续扩展或提升的能⼒。表现在系统基础设施 稳定不需要经常变更,应⽤之间较少耦合,对需求变更可以敏捷响应。它是系统架构设计层面的开闭原则,对扩展开 放,对修改封闭。也就说,当系统新增⼀个功能时,不需要对现有系统的结构和代码进⾏修改- 多态设计
 - 依赖注入
 - 面向接口而非实现编程
 - 装饰模式
 - 策略模式
 - 模板模式
 - 责任链模式
 - 状态模式
 - 拆分稳定服务与变化服务
 
 
 - 资源可扩展(伸缩性(Scalability)
 
- 单一职责原则 
 
常见架构设计模式
架构模式是一个通用的、可重用的解决方案,用于在给定上下文中的 软件体系结构中经常出现的问题。架构模式与软件设计模式类似,但具有更广泛的范围[维基百科]
- MVC架构
 

- 分层架构
分层思想是工业领域通用的准则 


- 微内核架构(插件化)
微内核架构分为内核管理以及插件模块。内核管理包括插件管理、插件加载、插件通信以及业务隔离。查检模块是封装变化的业务逻辑,支持灵活快速的扩展。整体来说微内核架构最核心的思想是隔离易变与不变 

- 事件驱动架构
 

- 整洁架构(洋葱架构)
 


- 六边形架构
 

- 微服务架构
 

- 可扩展架构(组合上述架构模式)
 
架构的表达
架构对象
架构的对象往往是现实世界的投影,或者说是对于现实世界的一个抽象,如面向对象里把事物抽象成类,或者通过一些业务的概念、系统、模块等去代表
架构意图
- 
架构视角
 从⼀个或多个⻆度对软件体系架构的各个⽅面进⾏关注,它反映了了软件架构的⼀个或多个利益相关者的不同关注层面
架构视图它与架构视角有关,去做架构表达的时候你得去从不同的视角去看。你可以从老板的视角去看、可以从客户的视角去看、可以从这个产品的视角去看、可以从工程师和评委的视角去看,不同的视角得出的架构视图是不一样的架构视图
架构对象(物)+架构意图(⼈)+架构视⻆(⻆度)决定架构视图
比如架构五视图(逻辑架构图、开发架构图、运行架构图、物理架构图、数据架构图)架构的演进与规划
问题分析
原则
- 对于未来整体性、⻓期性、基本性问题的思考
 
方式
原则
- 定性->(粗)定量->定量(Smart)
 - 阶段里程碑事件
 
方式
原则
- Learn from the best
 - 识别盲区、发现差距
 
方式
原则
- 对规划进⾏系统性描述,执⾏者清楚自⼰的位置
 
方式
原则
- 设计全⾯、长远的行动方案
 
方式
- 执⾏计划:里程碑、优先级、人⼒排布
 - 风险评估:技术风险与管理风险
 - 贯彻执⾏:定期总结、阶段性check、及时调整
架构评估
权衡取舍
参考材料1:http://www.360doc.com/content/21/0728/07/29297912_988490505.shtml 
灵活性
- 系统方案是否具备很好的灵活性(能低成本应对业务未来变化的不确定性)
 
- 可扩展/可维护性 
- 开发架构是否满足软件设计原则
 - 如果采用了某架构模式是否遵循最佳实践
 
 - 开发效率
 - 资源消耗 
- 开发资源(开发人员/开发时间)
 - 硬件资源(服务器数量、存储空间)
 - 单机资源(CPU/内存/网卡宽带/磁盘/电力资源)
 - 上下游依赖资源(DB消耗/中间件资源消耗)
 
 - 复用性
 - 性能 
- 不同方案的性能对比(QPS/TPS/RPS)
 
 - 延迟与吞吐量 
- 在延迟可接受的前提下,追求最大的吞吐量
 
 - 可用性与一致性 
- 系统方案是否能最佳平衡可用性与一致性(CAP理论)
 
 - 稳定性
 
