# 模块一 架构师与云原生

## 目录 <a href="#mu-lu" id="mu-lu"></a>

* 什么是软件架构
* 软件架构的基本思路
* 单体向分布式演进、云原生、技术中台

## 1.1 什么是软件架构 <a href="#id-11-shen-me-shi-ruan-jian-jia-gou" id="id-11-shen-me-shi-ruan-jian-jia-gou"></a>

### 1.1.1 什么是架构？ <a href="#id-111-shen-me-shi-jia-gou" id="id-111-shen-me-shi-jia-gou"></a>

Software architecture = {Elements, Forms, Rationale/Constraints}

元素、形式/模式、基本原理和限制

#### 为什么需要软件架构？ <a href="#wei-shen-me-xu-yao-ruan-jian-jia-gou" id="wei-shen-me-xu-yao-ruan-jian-jia-gou"></a>

软件架构的终极目标是用最小的人力成本来满足构建和维护系统的需求

一个软件架构的优劣，可以用它满足用户需求的成本来衡量。如果该成本很低，并且在系统的整个生命周期内一直都维持这样的低成本，那么这个系统的设计就是优良的，如果该系统的每次发布都会提升下一次变更的成本，那么这个设计就是不好的，就这么简单。

\--架构整洁之道

#### 产品经理 <a href="#chan-pin-jing-li" id="chan-pin-jing-li"></a>

* 需求分析
* 需求设计
* 项目管理
* 产品运营

### 1.1.2 什么是架构师？ <a href="#id-112-shen-me-shi-jia-gou-shi" id="id-112-shen-me-shi-jia-gou-shi"></a>

#### 系统的维度 <a href="#xi-tong-de-wei-du" id="xi-tong-de-wei-du"></a>

负责整体系统的架构设计，主要是基础服务和各系统间的协调上，着眼全局不太注重某个应用本身架构，比如关注服务器负载，可靠性，伸缩，扩展，数据库切分，缓存应用等方法的基础架构设计

#### 应用程序的维度 <a href="#ying-yong-cheng-xu-de-wei-du" id="ying-yong-cheng-xu-de-wei-du"></a>

负责某个应用的技术架构，主要偏业务系统，关注理解业务，梳理模型，设计模式，接口，数据交互等方面

#### 业务流程的维度 <a href="#ye-wu-liu-cheng-de-wei-du" id="ye-wu-liu-cheng-de-wei-du"></a>

关注某一个行业、业务的领域分析，获取领域模型，最终获得系统的模型

也可以叫业务领域专家、行业专家、产品咨询师、资深顾问

#### 降低成本 <a href="#jiang-di-cheng-ben" id="jiang-di-cheng-ben"></a>

通过设计和实现优良的软件架构来持续降低软件的构建和维护成本

软件架构这项工作的实质就是规划如何将系统拆分成组件，并安排好组件之间的排列关系以及组件之间互相通信的方式

#### 如何降低成本？ <a href="#ru-he-jiang-di-cheng-ben" id="ru-he-jiang-di-cheng-ben"></a>

* 低成本维护（容易被改动和理解）
* 软件可复用
* 轻松部署

设计原则会给我们答案

软件架构师的目标是创建一种系统形态，该形态会以策略为最基本的元素，并让细节与策略脱离关系，一个优秀的软件架构师应该致力于最大化可选项数量

#### 职能 <a href="#zhi-neng" id="zhi-neng"></a>

1. 负责公司系统架构设计、研发工作
2. 承担从业务向技术转换的桥梁作用
3. 协作项目经理制定项目计划和控制项目进度
4. 负责辅助并指导 SA 开展设计工作
5. 负责组织技术研究和攻关工作
6. 负责组织和管理公司内部的技术培训工作
7. 负责组织及带领公司内部员工研究与项目相关的新技术
8. 管理技术支撑团队并给项目、产品开发实施团队提供技术保障
9. 理解系统的业务需求，制定系统的整体框架（包括：技术框架和业务框架）
10. 对系统框架相关技术和业务进行培训，指导开发人员开发
11. 解决系统开发、运行中出现的各种问题
12. 对系统的重用、扩展、安全、性能、伸缩性、简洁等做系统级的把握

#### 软件周期内，标准组织架构下的各个职位的分工 <a href="#ruan-jian-zhou-qi-nei-biao-zhun-zu-zhi-jia-gou-xia-de-ge-ge-zhi-wei-de-fen-gong" id="ruan-jian-zhou-qi-nei-biao-zhun-zu-zhi-jia-gou-xia-de-ge-ge-zhi-wei-de-fen-gong"></a>

* CEO
* CTO/CIO
* 产品总监/技术总监/架构师 Architect Director
* 资深开发/Manager
* 高级开发/Leader

### 1.1.3 软件架构分类 <a href="#id-113-ruan-jian-jia-gou-fen-lei" id="id-113-ruan-jian-jia-gou-fen-lei"></a>

从架构师的工作内容上来划分可以分为三类：

* 系统架构师
* 应用架构师
* 业务架构师

系统架构师/基础架构师

从系统的维度，负责整体系统的架构设计，主要是基础服务和各系统间协调上，着眼全局不太注重某个应用本身架构，比如关注服务器负载，可靠性，伸缩，扩展，数据库切分，缓存应用等方面的基础架构设计。

应用架构师

从应用程序的维度，负责某个应用的技术架构，主要偏业务系统，关注理解业务，梳理模型，设计模式，接口，数据交互等方面。

业务架构师

从业务流程的维度，关注某一个行业、业务的领域分析，获取领域模型，最终获得系统的模型。也可以叫业务领域专家、行业专家、产品咨询师、资深顾问。

基础架构、前端架构、后端架构是从职责上的分类。

### 1.1.4 架构风格 <a href="#id-114-jia-gou-feng-ge" id="id-114-jia-gou-feng-ge"></a>

* 分层架构
* 微核架构/六边形架构/简洁架构
* 事件驱动架构
* 微服务架构
* 云架构

#### 软件架构入门 <a href="#ruan-jian-jia-gou-ru-men" id="ruan-jian-jia-gou-ru-men"></a>

<http://www.ruanyifeng.com/blog/2016/09/software-architecture.html>

## 1.2 软件架构的基本思路 <a href="#id-12-ruan-jian-jia-gou-de-ji-ben-si-lu" id="id-12-ruan-jian-jia-gou-de-ji-ben-si-lu"></a>

### 1.2.1 如何理解需求 <a href="#id-121-ru-he-li-jie-xu-qiu" id="id-121-ru-he-li-jie-xu-qiu"></a>

#### 软件需求（第3版） <a href="#ruan-jian-xu-qiu-di-3-ban" id="ruan-jian-xu-qiu-di-3-ban"></a>

<https://book.douban.com/subject/26307910/>

#### 需求分类 <a href="#xu-qiu-fen-lei" id="xu-qiu-fen-lei"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FY4rxCLn0p6sQPlAj5S2M%2F172.jpg?alt=media\&token=69b59cb2-9fa5-4a32-bd64-4c8076eec4b2)

### 1.2.2 非功能性需求 <a href="#id-122-fei-gong-neng-xing-xu-qiu" id="id-122-fei-gong-neng-xing-xu-qiu"></a>

* 观感需求
* 易用性：性能/可用性
* 可扩展性
* 可维护性

### 1.2.3 4+1模型 <a href="#id-12341-mo-xing" id="id-12341-mo-xing"></a>

* 场景视图
* 逻辑视图
* 开发视图
* 处理视图
* 物理视图

### 1.2.4 场景视图 <a href="#id-124-chang-jing-shi-tu" id="id-124-chang-jing-shi-tu"></a>

* 用户可以开设一个训练营成为营长
* 营长可以制定训练营学生的任务和计划，可以快速利用到其他训练营
* 营长可以邀请其他用户加入训练营成为学员
* 营长可以对学员进行分组
* 营长可以添加指定学员成为助教并指定到分组
* 学员可以接受邀请加入训练营成为学员
* 学员加入训练营之后可以完成训练营内的任务
* 学员可以对训练营内的指定问题进行提问
* 学员可以查看自己的学员档案
* 营长/助教可以回答学员提出的问题
* 营长/助教可以对学员完成的任务进行考评打分

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FrN6YMoovuvqvdA8gAOyz%2F173.jpg?alt=media\&token=ca2e3ca8-e80d-4fec-b8d3-79cb4c4c8729)

### 1.2.5 逻辑视图 <a href="#id-125-luo-ji-shi-tu" id="id-125-luo-ji-shi-tu"></a>

面向对象分解

用来支持功能性需求、系统应该被拆分为哪些问题域、对象

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FtIEprr2Wuu1D9yucWEiL%2F174.jpg?alt=media\&token=50a6096a-7775-49e6-b1b6-aceeef39c8c0)

### 1.2.6 开发视图 <a href="#id-126-kai-fa-shi-tu" id="id-126-kai-fa-shi-tu"></a>

关注软件模块组织和开发环境上、从组件、模块、子系统的组织和分层

每一层为上层提供有限的良好定义的接口供调用

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FEMTHjOxigDvImi5kIqY3%2F175.jpg?alt=media\&token=15f6c073-32e1-4614-9b26-a1412420ca8c)

* 团队结构
* 开发流程
* 测试计划
* 项目协作工具
* Road Map 发布计划

### 1.2.7 处理视图 <a href="#id-127-chu-li-shi-tu" id="id-127-chu-li-shi-tu"></a>

关注进程、线程、对象等运行的概念，以及相关的并发、同步、通信等问题

从软件实现的角度去关注非功能性需求

#### 单体 <a href="#dan-ti" id="dan-ti"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F3WnuD6KWFWIqiWLcrF5e%2F176.jpg?alt=media\&token=90c81f27-0f12-41dc-aa41-215f7e3e8d5b)

#### 分布式 <a href="#fen-bu-shi" id="fen-bu-shi"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FupRDIgGfw04G53EY4hto%2F177.jpg?alt=media\&token=9f2c2b41-152e-4355-bbeb-9cdc94576c1a)

### 2.8 物理视图 <a href="#id-28-wu-li-shi-tu" id="id-28-wu-li-shi-tu"></a>

从硬件角度去关注非功能属性

#### 单体 <a href="#dan-ti-1" id="dan-ti-1"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F6j5b3yaMPAYumrLxxJX7%2F178.jpg?alt=media\&token=7c6a7589-fe62-4f49-93e8-0ba703cdeb8d)

#### 分布式 <a href="#fen-bu-shi-1" id="fen-bu-shi-1"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FlyGE00T94wQ0FDc1RSIo%2F179.jpg?alt=media\&token=2c9d10cc-9132-4722-8723-3219ef40273d)

## 1.3 单体向分布式演进、云原生、技术中台 <a href="#id-13-dan-ti-xiang-fen-bu-shi-yan-jin-yun-yuan-sheng-ji-shu-zhong-tai" id="id-13-dan-ti-xiang-fen-bu-shi-yan-jin-yun-yuan-sheng-ji-shu-zhong-tai"></a>

### 1.3.1 单体的问题 <a href="#id-131-dan-ti-de-wen-ti" id="id-131-dan-ti-de-wen-ti"></a>

* 巨大的代码库
* 过载的 IDE
* 过载的 WEB 容器
* 持续部署困难
* 应用扩展困难
* 难于进行规模化开发

#### 模式: 单体架构 <a href="#mo-shi-dan-ti-jia-gou" id="mo-shi-dan-ti-jia-gou"></a>

<https://microservices.io/patterns/cn/monolithic.html>

### 1.3.2 高可用架构 <a href="#id-132-gao-ke-yong-jia-gou" id="id-132-gao-ke-yong-jia-gou"></a>

#### 系统设计 <a href="#xi-tong-she-ji" id="xi-tong-she-ji"></a>

* 故障转移
* 超时控制
* 降级和限流

#### 系统运维 <a href="#xi-tong-yun-wei" id="xi-tong-yun-wei"></a>

* 灰度发布
* 故障演练

**故障转移**

**完全对等的节点之间做故障转移**

在对等节点之间做故障转移，相对来说简单些

在这类系统中所有节点都承担读写流量，并且节点中不保存状态，每个节点都可以作为另一个节点的镜像

**不对等的节点之间，即系统中存在主节点也存在备节点**

使用最广泛的故障检测机制是“心跳”

你可以在客户端上定期地向主节点发送心跳包，也可以从备份节点上定期发送心跳包

当一段时间内未收到心跳包，就可以认为主节点已经发生故障，可以触发选主操作

**超时/降级/限流**

**数据库访问超时、rpc/远程调用超时、缓存/队列等其他中间件访问超时**

**探测出系统或者服务单位内允许出现的最大请求，直接拒绝后面的请求**

#### 水平/垂直扩展 <a href="#shui-ping-chui-zhi-kuo-zhan" id="shui-ping-chui-zhi-kuo-zhan"></a>

水平（也叫横向扩展）：用更多的节点支撑更大的请求

如成千上万的蚂蚁完成一项搬运工作

垂直（也叫纵向扩展）：扩展一个点的能力支撑更大的请求

如利用一个人的能力，如蜘蛛侠逼停火车

#### AKF 扩展立方 <a href="#akf-kuo-zhan-li-fang" id="akf-kuo-zhan-li-fang"></a>

X 轴：代表无差别的克隆服务和数据，工作可以很均匀的分散在不同的服务实例上

Y 轴：关注应用中职责的划分，比如数据类型，交易执行类型的划分

Z 轴：关注服务和数据的优先级划分，如分地域划分

#### 业务模块化打造单体和分布式部署同步支持方案 <a href="#ye-wu-mo-kuai-hua-da-zao-dan-ti-he-fen-bu-shi-bu-shu-tong-bu-zhi-chi-fang-an" id="ye-wu-mo-kuai-hua-da-zao-dan-ti-he-fen-bu-shi-bu-shu-tong-bu-zhi-chi-fang-an"></a>

<https://mp.weixin.qq.com/s/HE7BxH_RZo45bY2baNgt5Q>

**模块拆分原则**

* 微服务拆分的大部份原则依旧适用
* 一个业务模块对应一个数据库，不能直接查另一个业务模块的数据库
* 模块之间的调用通过抽象契约接口来完成
* 模块之间互相依赖只能依赖于抽象契约

### 1.3.3 云原生 <a href="#id-133-yun-yuan-sheng" id="id-133-yun-yuan-sheng"></a>

#### 什么是云原生 <a href="#shen-me-shi-yun-yuan-sheng" id="shen-me-shi-yun-yuan-sheng"></a>

云原生技术有利于各组织再公有云、私有云和混合云等新型动态环境中，构建和运行可弹性扩展的应用

云原生的代表技术包括容器、微服务、服务网络、不可变基础设施和声明式 API

这些技术可以让我们构建高度稳定、可控、可观测的松散耦合应用

但云原生方案的重点并不是应用部署在何处，而是如何构建、部署和管理应用

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F2O842g6zz8cjoRW2k94Z%2F180.jpg?alt=media\&token=78aa5145-c16d-4e02-8354-e861534aa53e)

**关键点**

* 不可变基础设施
* 12 因素：<https://12factor.net/zh_cn/>

#### 12 因素 <a href="#id-12-yin-su" id="id-12-yin-su"></a>

1. 基准代码：基准代码和应用之间总是保持一一对应的关系：

* 一旦有多个基准代码，就不能称为一个应用，而是一个分布式系统。分布式系统中的每一个组件都是一个应用，每一个应用可以分别使用 12因素 进行开发
* 多个应用共享一份基准代码是有悖于 12因素 原则的。解决方案就是将共享的代码拆分为独立的类库，然后使用 依赖管理 策略去加载它们

1. 显示声明依赖
2. 配置：推荐将配置保存于环境变量中
3. 把后端服务当作附加资源
4. 严格分享构建和运行
5. 以一个或多个无状态进程运行应用
6. 通过端口绑定提供服务：12因素 应用完全自我加载，而不依赖于任何网络服务就可以创建一个面向网络的服务。互联网应用通过端口绑定来提供服务，并监听发送至该端口的请求
7. 通过进程模型进行扩展
8. 快速启动和优雅终止可最大化健壮性
9. 尽可能的保持开发，预发布，线上环境相同
10. 把日志当作事件流
11. 后台管理任务当作一次性进程运行

#### 云原生 VS 微服务 <a href="#yun-yuan-sheng-vs-wei-fu-wu" id="yun-yuan-sheng-vs-wei-fu-wu"></a>

云原生方案与微服务架构类似

然而，尽管微服务可通过构建云原生应用来交付，可企业仍需要采取许多措施，才能在生产环境中熟练地管理微服务

而想要享受云原生应用的各种益处，也并非一定需要微服务

很多企业都通过基于相同的原则，构建出更优秀的模块化单体式应用，从而取得云原生方案的种种效益

### 1.3.4 技术中台 <a href="#id-134-ji-shu-zhong-tai" id="id-134-ji-shu-zhong-tai"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FScnMmbgXtBxuhhc3uI2V%2F181.jpg?alt=media\&token=a3053608-c653-4fd6-bd14-45a50bcdfa04)
