Software architecture = {Elements, Forms, Rationale/Constraints}
元素、形式/模式、基本原理和限制
软件架构的终极目标是用最小的人力成本来满足构建和维护系统的需求
一个软件架构的优劣,可以用它满足用户需求的成本来衡量。如果该成本很低,并且在系统的整个生命周期内一直都维持这样的低成本,那么这个系统的设计就是优良的,如果该系统的每次发布都会提升下一次变更的成本,那么这个设计就是不好的,就这么简单。
–架构整洁之道
负责整体系统的架构设计,主要是基础服务和各系统间的协调上,着眼全局不太注重某个应用本身架构,比如关注服务器负载,可靠性,伸缩,扩展,数据库切分,缓存应用等方法的基础架构设计
负责某个应用的技术架构,主要偏业务系统,关注理解业务,梳理模型,设计模式,接口,数据交互等方面
关注某一个行业、业务的领域分析,获取领域模型,最终获得系统的模型
也可以叫业务领域专家、行业专家、产品咨询师、资深顾问
通过设计和实现优良的软件架构来持续降低软件的构建和维护成本
软件架构这项工作的实质就是规划如何将系统拆分成组件,并安排好组件之间的排列关系以及组件之间互相通信的方式
设计原则会给我们答案
软件架构师的目标是创建一种系统形态,该形态会以策略为最基本的元素,并让细节与策略脱离关系,一个优秀的软件架构师应该致力于最大化可选项数量
从架构师的工作内容上来划分可以分为三类:
系统架构师/基础架构师
从系统的维度,负责整体系统的架构设计,主要是基础服务和各系统间协调上,着眼全局不太注重某个应用本身架构,比如关注服务器负载,可靠性,伸缩,扩展,数据库切分,缓存应用等方面的基础架构设计。
应用架构师
从应用程序的维度,负责某个应用的技术架构,主要偏业务系统,关注理解业务,梳理模型,设计模式,接口,数据交互等方面。
业务架构师
从业务流程的维度,关注某一个行业、业务的领域分析,获取领域模型,最终获得系统的模型。也可以叫业务领域专家、行业专家、产品咨询师、资深顾问。
基础架构、前端架构、后端架构是从职责上的分类。
https://mp.weixin.qq.com/s/JWOIScGrX0Hszz4uqdA6qw
http://www.ruanyifeng.com/blog/2016/09/software-architecture.html
https://book.douban.com/subject/26307910/
面向对象分解
用来支持功能性需求、系统应该被拆分为哪些问题域、对象
关注软件模块组织和开发环境上、从组件、模块、子系统的组织和分层
每一层为上层提供有限的良好定义的接口供调用
关注进程、线程、对象等运行的概念,以及相关的并发、同步、通信等问题
从软件实现的角度去关注非功能性需求
从硬件角度去关注非功能属性
https://microservices.io/patterns/cn/monolithic.html
在对等节点之间做故障转移,相对来说简单些
在这类系统中所有节点都承担读写流量,并且节点中不保存状态,每个节点都可以作为另一个节点的镜像
使用最广泛的故障检测机制是“心跳”
你可以在客户端上定期地向主节点发送心跳包,也可以从备份节点上定期发送心跳包
当一段时间内未收到心跳包,就可以认为主节点已经发生故障,可以触发选主操作
水平(也叫横向扩展):用更多的节点支撑更大的请求
如成千上万的蚂蚁完成一项搬运工作
垂直(也叫纵向扩展):扩展一个点的能力支撑更大的请求
如利用一个人的能力,如蜘蛛侠逼停火车
X 轴:代表无差别的克隆服务和数据,工作可以很均匀的分散在不同的服务实例上
Y 轴:关注应用中职责的划分,比如数据类型,交易执行类型的划分
Z 轴:关注服务和数据的优先级划分,如分地域划分
https://mp.weixin.qq.com/s/HE7BxH_RZo45bY2baNgt5Q
云原生技术有利于各组织再公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用
云原生的代表技术包括容器、微服务、服务网络、不可变基础设施和声明式 API
这些技术可以让我们构建高度稳定、可控、可观测的松散耦合应用
但云原生方案的重点并不是应用部署在何处,而是如何构建、部署和管理应用
云原生方案与微服务架构类似
然而,尽管微服务可通过构建云原生应用来交付,可企业仍需要采取许多措施,才能在生产环境中熟练地管理微服务
而想要享受云原生应用的各种益处,也并非一定需要微服务
很多企业都通过基于相同的原则,构建出更优秀的模块化单体式应用,从而取得云原生方案的种种效益