描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111742876丛书名: 架构师书库
编辑推荐
开发规模和复杂性不断增长的大型系统需要深刻理解软件项目的实施过程。软件开发人员、架构师和技术管理团队遵循高级软件设计模式(如微服务架构、事件驱动架构,以及领域驱动设计规定的策略模式),可以简化开发过程。 本书涵盖了这些成熟的架构设计模式,并以前瞻性的方法帮助Python开发人员管理复杂应用程序的开发,令其从Python测试套件中获取最大价值。 本书从系统设计的起始阶段开始,让你了解软件开发的思路和项目中要考虑的重点问题。书中阐述了各种架构模式,如微服务、Web服务和事件驱动架构,以及如何选择最适合你的项目的模式。然后,在建立相关概念的基础上,讨论如何进行开发、调试和测试,以编写高质量的代码,并为系统部署做好准备。此外,本书还讲解了当系统部署到最终用户之后如何实现持续运维,因为软件开发的生命周期永无止境。 学完本书,你将形成“架构思维”:一种不一样的软件设计方法,包括对运行中的系统进行调整。 通过学习本书,你将可以: ? 像架构师一样思考,分析软件架构模式。 ? 探索API设计、数据存储和数据呈现方法。 ? 探究常见架构模式的细微差别。 ? 利用微服务等架构模式的组件并实现其互操作。 ? 采用测试驱动开发模式执行高质量的代码测试。 ? 将大块可重用的代码构建为软件包。 ? 保持系统向后兼容性并部署其迭代变更。
内容简介
本书讲解软件架构系统各方面的内容,从顶层设计到用于支持高层功能的低层细节。本书首先介绍软件架构的含义并给出简单的设计示例,之后分为四个部分涵盖软件开发生命周期中的各个阶段:讨论构成系统的每个组成单元的一般性原则及其核心内容;重点介绍一些成功的架构模式,包括它们的优势和局限性;阐述如何进行软件测试以及如何构建和共享代码;讲解持续运维,涵盖日志、系统度量、性能分析、代码调试和架构调整等内容。本书将帮你形成架构思维,了解软件开发的思路和项目中要考虑的重点问题。
目 录
Contents目 录
译者序
前言
关于作者
关于审校者
第1章 软件架构简介 1
1.1 设计软件系统的架构 1
1.2 划分为较小的单元 3
1.3 康威定律:对软件架构的影响 5
1.4 应用示例:概述 6
1.5 软件架构安全 8
1.6 小结 9
第一部分 设计
第2章 API设计 13
2.1 抽象 14
2.1.1 使用合适的抽象 15
2.1.2 抽象失效 16
2.1.3 资源与操作抽象 17
2.2 RESTful接口 18
2.2.1 实用性定义 19
2.2.2 HTTP头部及状态 21
2.2.3 资源设计 24
2.2.4 资源与参数 25
2.2.5 分页 26
2.2.6 RESTful API流程设计 27
2.2.7 使用Open API规范 29
2.3 认证 32
2.3.1 HTML接口认证 33
2.3.2 RESTful接口认证 34
2.4 API版本管理 38
2.4.1 为何需要版本管理 38
2.4.2 内部版本与外部版本 38
2.4.3 语义化版本管理 39
2.4.4 简单的版本管理 40
2.5 前端与后端 41
2.6 HTML接口 43
2.6.1 传统HTML接口 43
2.6.2 动态页面 44
2.6.3 单页应用程序 45
2.6.4 混合模式 46
2.7 API设计示例 47
2.7.1 端点 48
2.7.2 设计及实现审查 55
2.8 小结 55
第3章 数据建模 56
3.1 数据库的类型 56
3.1.1 关系数据库 57
3.1.2 非关系数据库 59
3.1.3 小型数据库 62
3.2 数据库事务 63
3.3 分布式关系数据库 65
3.3.1 主库/副本 65
3.3.2 分片 67
3.3.3 分片的优势和劣势 71
3.4 数据库模式设计 72
3.4.1 模式规范化 75
3.4.2 去规范化 77
3.5 数据索引 78
3.6 小结 81
第4章 数据层 82
4.1 模型层 82
4.1.1 DDD 83
4.1.2 使用ORM 84
4.1.3 工作单元模式及数据封装 90
4.1.4 CQRS使用不同的读写
模型 93
4.2 数据库迁移 96
4.2.1 向后兼容性 96
4.2.2 关系数据库迁移 97
4.2.3 非关系数据库迁移 101
4.3 处理遗留数据库 102
4.3.1 检测数据库模式 103
4.3.2 同步现有模式至ORM 104
4.4 小结 105
第二部分 架构模式
第5章 十二要素App方法论 109
5.1 十二要素App简介 109
5.2 CI 110
5.3 可扩展性 111
5.4 配置 113
5.5 十二要素 115
5.5.1 一次构建,多次运行 115
5.5.2 依赖项和配置 117
5.5.3 可扩展性 120
5.5.4 监控和管理 122
5.6 容器化的十二要素App 125
5.7 小结 126
第6章 Web服务器架构 127
6.1 请求–响应架构 127
6.2 Web架构 129
6.3 Web服务器 130
6.3.1 由外部提供静态内容 131
6.3.2 反向代理 133
6.3.3 日志 135
6.3.4 高级用法 136
6.4 uWSGI 136
6.4.1 WSGI应用程序 137
6.4.2 与Web服务器交互 138
6.4.3 进程 139
6.4.4 进程生命周期 140
6.5 Python Worker 143
6.5.1 Django MVT架构 143
6.5.2 将请求路由到视图 144
6.5.3 视图 146
6.5.4 中间件 150
6.5.5 Django REST框架 152
6.6 外部层 158
6.7 小结 158
第7章 事件驱动架构 160
7.1 发送事件 160
7.2 异步任务 161
7.3 任务细分 164
7.4 计划任务 165
7.5 队列机制 166
7.5.1 统一Worker代码 169
7.5.2 云队列和Worker 169
7.6 Celery 171
7.6.1 配置Celery 172
7.6.2 Celery Worker 172
7.6.3 触发任务 175
7.6.4 联调 175
7.6.5 计划任务 178
7.6.6 Celery Flower 182
7.6.7 Flower的HTTP API 184
7.7 小结 185
第8章 高级事件驱动架构 187
8.1 流式事件 187
8.2 管道 190
8.2.1 准备 191
8.2.2 基础任务 192
8.2.3 图像任务 193
8.2.4 视频任务 195
8.2.5 连接任务 196
8.2.6 运行任务 198
8.3 定义总线 200
8.4 更复杂的系统 201
8.5 测试事件驱动系统 204
8.6 小结 205
第9章 微服务与单体 207
9.1 单体架构 207
9.2 微服务架构 208
9.3 架构选择 209
9.4 关键因素:团队沟通 213
9.5 从单体迁移到微服务 216
9.5.1 迁移面临的挑战 216
9.5.2 四步迁移 218
9.6 服务容器化 224
9.6.1 构建并运行镜像 226
9.6.2 构建并运行Web服务 228
9.7 容器编排与Kubernetes 236
9.8 小结 237
第三部分 实现
第10章 测试与TDD 241
10.1 代码测试 2
译者序
前言
关于作者
关于审校者
第1章 软件架构简介 1
1.1 设计软件系统的架构 1
1.2 划分为较小的单元 3
1.3 康威定律:对软件架构的影响 5
1.4 应用示例:概述 6
1.5 软件架构安全 8
1.6 小结 9
第一部分 设计
第2章 API设计 13
2.1 抽象 14
2.1.1 使用合适的抽象 15
2.1.2 抽象失效 16
2.1.3 资源与操作抽象 17
2.2 RESTful接口 18
2.2.1 实用性定义 19
2.2.2 HTTP头部及状态 21
2.2.3 资源设计 24
2.2.4 资源与参数 25
2.2.5 分页 26
2.2.6 RESTful API流程设计 27
2.2.7 使用Open API规范 29
2.3 认证 32
2.3.1 HTML接口认证 33
2.3.2 RESTful接口认证 34
2.4 API版本管理 38
2.4.1 为何需要版本管理 38
2.4.2 内部版本与外部版本 38
2.4.3 语义化版本管理 39
2.4.4 简单的版本管理 40
2.5 前端与后端 41
2.6 HTML接口 43
2.6.1 传统HTML接口 43
2.6.2 动态页面 44
2.6.3 单页应用程序 45
2.6.4 混合模式 46
2.7 API设计示例 47
2.7.1 端点 48
2.7.2 设计及实现审查 55
2.8 小结 55
第3章 数据建模 56
3.1 数据库的类型 56
3.1.1 关系数据库 57
3.1.2 非关系数据库 59
3.1.3 小型数据库 62
3.2 数据库事务 63
3.3 分布式关系数据库 65
3.3.1 主库/副本 65
3.3.2 分片 67
3.3.3 分片的优势和劣势 71
3.4 数据库模式设计 72
3.4.1 模式规范化 75
3.4.2 去规范化 77
3.5 数据索引 78
3.6 小结 81
第4章 数据层 82
4.1 模型层 82
4.1.1 DDD 83
4.1.2 使用ORM 84
4.1.3 工作单元模式及数据封装 90
4.1.4 CQRS使用不同的读写
模型 93
4.2 数据库迁移 96
4.2.1 向后兼容性 96
4.2.2 关系数据库迁移 97
4.2.3 非关系数据库迁移 101
4.3 处理遗留数据库 102
4.3.1 检测数据库模式 103
4.3.2 同步现有模式至ORM 104
4.4 小结 105
第二部分 架构模式
第5章 十二要素App方法论 109
5.1 十二要素App简介 109
5.2 CI 110
5.3 可扩展性 111
5.4 配置 113
5.5 十二要素 115
5.5.1 一次构建,多次运行 115
5.5.2 依赖项和配置 117
5.5.3 可扩展性 120
5.5.4 监控和管理 122
5.6 容器化的十二要素App 125
5.7 小结 126
第6章 Web服务器架构 127
6.1 请求–响应架构 127
6.2 Web架构 129
6.3 Web服务器 130
6.3.1 由外部提供静态内容 131
6.3.2 反向代理 133
6.3.3 日志 135
6.3.4 高级用法 136
6.4 uWSGI 136
6.4.1 WSGI应用程序 137
6.4.2 与Web服务器交互 138
6.4.3 进程 139
6.4.4 进程生命周期 140
6.5 Python Worker 143
6.5.1 Django MVT架构 143
6.5.2 将请求路由到视图 144
6.5.3 视图 146
6.5.4 中间件 150
6.5.5 Django REST框架 152
6.6 外部层 158
6.7 小结 158
第7章 事件驱动架构 160
7.1 发送事件 160
7.2 异步任务 161
7.3 任务细分 164
7.4 计划任务 165
7.5 队列机制 166
7.5.1 统一Worker代码 169
7.5.2 云队列和Worker 169
7.6 Celery 171
7.6.1 配置Celery 172
7.6.2 Celery Worker 172
7.6.3 触发任务 175
7.6.4 联调 175
7.6.5 计划任务 178
7.6.6 Celery Flower 182
7.6.7 Flower的HTTP API 184
7.7 小结 185
第8章 高级事件驱动架构 187
8.1 流式事件 187
8.2 管道 190
8.2.1 准备 191
8.2.2 基础任务 192
8.2.3 图像任务 193
8.2.4 视频任务 195
8.2.5 连接任务 196
8.2.6 运行任务 198
8.3 定义总线 200
8.4 更复杂的系统 201
8.5 测试事件驱动系统 204
8.6 小结 205
第9章 微服务与单体 207
9.1 单体架构 207
9.2 微服务架构 208
9.3 架构选择 209
9.4 关键因素:团队沟通 213
9.5 从单体迁移到微服务 216
9.5.1 迁移面临的挑战 216
9.5.2 四步迁移 218
9.6 服务容器化 224
9.6.1 构建并运行镜像 226
9.6.2 构建并运行Web服务 228
9.7 容器编排与Kubernetes 236
9.8 小结 237
第三部分 实现
第10章 测试与TDD 241
10.1 代码测试 2
前 言
Preface前 言
软件的发展意味着随着时间的推移系统会变得越来越复杂,需要越来越多的开发人员协同工作。随着软件系统规模的增长,一个总体的架构也随之产生。如果没有对系统架构进行很好的规划,软件系统将会变得非常混乱且难以维护。
软件架构所要解决的问题就是规划和设计软件系统的架构。一个设计良好的架构可以让不同的团队相互交流,同时对各自的责任和目标有清晰的认识。
系统的架构应当被设计成可以在最小的阻碍下进行日常软件开发,而且允许增加功能,以及对系统进行扩展。一个处于运行状态的系统,其架构总是在变化,还可以对其进行功能调整和扩充,从而以一种审慎而平滑的方式重塑不同的软件单元。
在本书中,我们将学习软件架构系统的各方面内容,从顶层设计到用于支持高层功能的低层细节。本书内容分为四个部分,涵盖软件开发生命周期中的各个阶段:
编写代码之前首先进行设计;
采用经验证的架构模式;
用代码实现设计;
持续运维以适应变化,并确保系统按预期状态运行。
本书内容将包含上述所有相关内容的不同技术实现。
目标读者
本书是为那些想要扩充其软件架构知识的开发人员准备的,无论是经验丰富的开发人员,还是想提高自身能力的软件开发新手,都可以通过学习本书内容,用更宽广的视野来应对更大规模的软件系统开发。
本书使用Python编写的代码作为示例。虽然不要求读者是Python开发专家,但需要具备一定的Python基础知识。
本书内容
第1章介绍什么是软件架构以及为什么它很有用,同时还提供一个设计示例。
第一部分涵盖编写软件代码之前的设计阶段的相关内容:
第2章展示设计可用API的基础知识,这些API可以方便地抽象出各种操作。
第3章讲述存储系统的特殊性以及如何为应用程序设计合适的数据表示。
第4章讨论处理存储数据的代码,以及如何使其满足需求。
第二部分包含各种不同的架构模式,这些模式重用了已被验证的软件架构:
第5章展示“十二要素App”方法论在有效处理Web服务时的良好实践,并将其应用于不同场景。
第6章阐述Web服务器以及在实施和软件设计过程中需要考虑的相关要素。
第7章描述另一种类型的异步系统,它接收信息时不立即返回响应。
第8章阐述更多异步系统的高级用法,以及一些不同的可创建的模式。
第9章介绍两种针对复杂系统的架构,并阐述它们之间的区别。
第三部分是本书的代码实现部分,介绍如何编写代码:
第10章阐述测试的基本原理以及如何在编码过程中使用TDD(Test Driven Development,测试驱动开发)。
第11章讨论创建可重复使用的代码的过程,以及如何对其进行分发。
第四部分是关于持续运维的内容,即系统正在运行,并且需要在调整和修改的同时对其进行监控:
第12章阐述如何记录运行中的系统正在做什么。
第13章讨论如何多方汇集数据以查看整个系统的状况。
第14章阐述如何了解代码的执行情况以提高其性能。
第15章涵盖深入挖掘代码执行的过程以发现并修复其中的错误。
第16章描述如何在运行的系统中有效地进行架构调整。
充分利用本书
本书的示例代码使用Python语言,并假定读者能够自如地阅读,但不需要专家级别的水平。
如果之前接触过包含多种服务的复杂系统,将有利于理解软件架构所带来的各种挑战。这对于有几年或更多经验的开发人员来说应该很简单。
熟悉Web服务和REST接口有助于更好地理解某些原理。
下载示例代码文件
本书的代码包托管在GitHub上,地址是https://github.com/PacktPublishing/Python-Architecture-Patterns。
下载彩色图片
我们还提供了一个PDF文件,其中包含本书所用到的屏幕截图、图表的彩色图片文件。可
以从https://static.packt-cdn.com/downloads/9781801819992_ColorImages.pdf下载。
排版约定
本书中使用了以下排版约定。
CodeInText(代码体):表示文本中的程序代码、对象名、模块名、文件夹名、文件名、文件扩展名、路径名、虚拟URL和用户输入等。下面是一个例子:“对于这个方法,我们需要导入requests(请求)模块”。
示例代码块如下:
软件的发展意味着随着时间的推移系统会变得越来越复杂,需要越来越多的开发人员协同工作。随着软件系统规模的增长,一个总体的架构也随之产生。如果没有对系统架构进行很好的规划,软件系统将会变得非常混乱且难以维护。
软件架构所要解决的问题就是规划和设计软件系统的架构。一个设计良好的架构可以让不同的团队相互交流,同时对各自的责任和目标有清晰的认识。
系统的架构应当被设计成可以在最小的阻碍下进行日常软件开发,而且允许增加功能,以及对系统进行扩展。一个处于运行状态的系统,其架构总是在变化,还可以对其进行功能调整和扩充,从而以一种审慎而平滑的方式重塑不同的软件单元。
在本书中,我们将学习软件架构系统的各方面内容,从顶层设计到用于支持高层功能的低层细节。本书内容分为四个部分,涵盖软件开发生命周期中的各个阶段:
编写代码之前首先进行设计;
采用经验证的架构模式;
用代码实现设计;
持续运维以适应变化,并确保系统按预期状态运行。
本书内容将包含上述所有相关内容的不同技术实现。
目标读者
本书是为那些想要扩充其软件架构知识的开发人员准备的,无论是经验丰富的开发人员,还是想提高自身能力的软件开发新手,都可以通过学习本书内容,用更宽广的视野来应对更大规模的软件系统开发。
本书使用Python编写的代码作为示例。虽然不要求读者是Python开发专家,但需要具备一定的Python基础知识。
本书内容
第1章介绍什么是软件架构以及为什么它很有用,同时还提供一个设计示例。
第一部分涵盖编写软件代码之前的设计阶段的相关内容:
第2章展示设计可用API的基础知识,这些API可以方便地抽象出各种操作。
第3章讲述存储系统的特殊性以及如何为应用程序设计合适的数据表示。
第4章讨论处理存储数据的代码,以及如何使其满足需求。
第二部分包含各种不同的架构模式,这些模式重用了已被验证的软件架构:
第5章展示“十二要素App”方法论在有效处理Web服务时的良好实践,并将其应用于不同场景。
第6章阐述Web服务器以及在实施和软件设计过程中需要考虑的相关要素。
第7章描述另一种类型的异步系统,它接收信息时不立即返回响应。
第8章阐述更多异步系统的高级用法,以及一些不同的可创建的模式。
第9章介绍两种针对复杂系统的架构,并阐述它们之间的区别。
第三部分是本书的代码实现部分,介绍如何编写代码:
第10章阐述测试的基本原理以及如何在编码过程中使用TDD(Test Driven Development,测试驱动开发)。
第11章讨论创建可重复使用的代码的过程,以及如何对其进行分发。
第四部分是关于持续运维的内容,即系统正在运行,并且需要在调整和修改的同时对其进行监控:
第12章阐述如何记录运行中的系统正在做什么。
第13章讨论如何多方汇集数据以查看整个系统的状况。
第14章阐述如何了解代码的执行情况以提高其性能。
第15章涵盖深入挖掘代码执行的过程以发现并修复其中的错误。
第16章描述如何在运行的系统中有效地进行架构调整。
充分利用本书
本书的示例代码使用Python语言,并假定读者能够自如地阅读,但不需要专家级别的水平。
如果之前接触过包含多种服务的复杂系统,将有利于理解软件架构所带来的各种挑战。这对于有几年或更多经验的开发人员来说应该很简单。
熟悉Web服务和REST接口有助于更好地理解某些原理。
下载示例代码文件
本书的代码包托管在GitHub上,地址是https://github.com/PacktPublishing/Python-Architecture-Patterns。
下载彩色图片
我们还提供了一个PDF文件,其中包含本书所用到的屏幕截图、图表的彩色图片文件。可
以从https://static.packt-cdn.com/downloads/9781801819992_ColorImages.pdf下载。
排版约定
本书中使用了以下排版约定。
CodeInText(代码体):表示文本中的程序代码、对象名、模块名、文件夹名、文件名、文件扩展名、路径名、虚拟URL和用户输入等。下面是一个例子:“对于这个方法,我们需要导入requests(请求)模块”。
示例代码块如下:
请注意,为简洁起见,书中列出的代码可能被编辑过。必要时可参考GitHub上的完整代码。
本书中所有在命令行输入或输出的内容均为如下形式(注意$符号):
本书中所有在Python解释器中输入的内容均为如下形式(注意>>>符号)。预期的程序输出信息将出现在没有>>>符号的地方:
要进入Python解释器,需运行不带参数的python3命令:
本书中所有在命令行输入或输出的内容均为如下形式:
黑体字:表示一个新术语、一个重要的词或在界面上看到的词,比如,菜单或对话框中的词。例如:“在Administration(管理)面板上选择System info(系统信息)菜单”。
表示警告或重要说明。
表示提示或技巧。
评论
还没有评论。