新书速递
随着“云计算”的兴起,越来越多的公司开始“上云”。很多公司的上云之路是从传统应用的迁移开始的,但越来越多的创新企业开始直接基于云基础设施来设计、开发新一代应用。于是“云原生应用”这个概念这两年也变得愈发火热。这种“诞生在云上的公司”往往具备很多不同寻常的特质,这使其具有快速爆发的潜力。利用公有云丰富的IaaS、PaaS和SaaS产品,公司可以实现业务的高度弹性,也便于实现数据驱动的运营。毫无疑问,“云原生”正悄然改变着软件开发的传统思维和模式。
和所有技术一样,云原生也不是一颗“银弹”。其本质是一个理念,而在这个理念的背后是云计算、容器、函数计算等核心技术,而这些技术扩展开又会涉及很多特定的技术和最佳实践。市面上已经有很多书在阐述这些特定的技术了,但是能够把这些技术综合起来,围绕云原生去系统地介绍这些技术的基础概念和知识、应用场景和最佳实践,也只有《云原生:运用容器、函数计算和数据构建下一代应用》这本书了。
●编辑推荐●
本书旨在能够提供一些基础知识,来帮助开发者和架构师更从容地开启云原生应用之旅。
本书首先介绍一些分布式系统的基本原理及其与云原生应用的关系,然后再进一步介绍容器和函数等相关技术,接着,本书会介绍服务间的通信模式、服务的弹性和数据模式,并讨论在什么情况下应该使用这些技术,最后会总结一些经验性的东西,例如如何结合DevOps方法,怎么兼顾可移植性,以及一些最佳实践。
这些最佳实践对于打造一个成功的云原生应用是非常有帮助的。这本书不会手把手教你如何实现一个满足特定业务需求的云原生应用。但是在读完这本书之后,你一定会知道如何去设计、构建和运维一个成功的云原生应用。
● 目录●
前言1
第1章 云原生简介5
1.1 分布式系统5
1.1.1 分布式系统的误区5
1.1.2 CAP定理8
1.2 十二要素应用8
1.3 可用性和服务等级协议11
1.4 本章小结12
第2章 云原生基础13
2.1 容器13
2.1.1 容器隔离等级15
2.1.2 容器编排16
2.1.3 Kubernetes概述17
2.1.4 Kubernetes和容器20
2.2 无服务器架构21
2.3 函数计算22
2.4 从虚拟机到云原生23
2.4.1 提升和转变23
2.4.2 应用的现代化改造24
2.4.3 应用的优化26
2.5 微服务26
2.5.1 微服务架构的优势27
2.5.2 微服务架构带来的挑战29
2.6 本章小结31
第3章 云原生应用的设计33
3.1 云原生应用的基础33
3.1.1 精益运营33
3.1.2 安全性35
3.1.3 可靠性与可用性36
3.1.4 可扩展性与成本37
3.2 云原生与传统架构的对比37
3.3 函数计算与服务41
3.3.1 函数计算的使用场景42
3.3.2 使用函数计算的考虑因素42
3.3.3 函数与服务的组合运用43
3.4 API设计与版本控制45
3.4.1 API的前后兼容46
3.4.2 语义版本号47
3.5 服务间的通信48
3.5.1 通信协议48
3.5.2 消息协议50
3.5.3 序列化的考虑因素50
3.5.4 幂等性51
3.5.5 请求与响应52
3.5.6 发布者与订阅者53
3.5.7 发布者/订阅者模式与请求/响应模式间的选择55
3.5.8 同步与异步56
3.6 网关56
3.6.1 路由57
3.6.2 聚合58
3.6.3 卸载59
3.6.4 网关的实现60
3.7 出口网关60
3.8 服务网格60
3.9 架构示例69
3.10 本章小结73
第4章 数据处理75
4.1 数据存储系统76
4.1.1 对象、文件和磁盘77
4.1.2 数据库78
4.1.3 流和队列80
4.1.4 区块链81
4.1.5 数据存储的选择81
4.2 多数据存储下的数据84
4.2.1 捕获数据更改85
4.2.2 将更改作为事件写入更改日志87
4.2.3 事务监管88
4.2.4 事务回滚90
4.2.5 提取、转换和加载90
4.2.6 微服务和数据湖91
4.3 客户端访问数据94
4.3.1 受限的客户令牌(代客密钥)94
4.3.2 细粒度访问控制的数据库服务95
4.3.3 GraphQL数据服务96
4.4 可快速伸缩的数据97
4.4.1 数据分片98
4.4.2 数据缓存98
4.4.3 内容分发网络99
4.5 数据分析101
4.5.1 数据流101
4.5.2 批处理101
4.5.3 对象存储上的数据湖102
4.5.4 数据湖和数据仓库102
4.5.5 分布式查询引擎103
4.6 Kubernetes中的数据库104
4.6.1 存储卷104
4.6.2 StatefulSet106
4.6.3 DaemonSet107
4.7 本章小结107
第5章 DevOps109
5.1 什么是DevOps109
5.1.1 协作109
5.1.2 自动化110
5.1.3 精益原则和流程110
5.1.4 度量111
5.1.5 分享111
5.2 测试112
5.2.1 测试替身113
5.2.2 自动化测试金字塔113
5.2.3 不同测试类型的适用时机118
5.2.4 测试节奏119
5.2.5 在生产环境中测试120
5.3 开发环境和工具122
5.3.1 开发工具123
5.3.2 开发环境126
5.3.3 本地开发环境126
5.3.4 本地开发环境结合远端集群127
5.3.5 Skaffold开发工作流127
5.3.6 将远端集群路由到本地开发环境129
5.3.7 云端开发环境129
5.4 持续集成/持续交付130
5.4.1 源代码管理131
5.4.2 构建阶段132
5.4.3 测试阶段132
5.4.4 部署阶段134
5.4.5 发布阶段136
5.4.6 发布后阶段137
5.5 监控137
5.5.1 收集指标139
5.5.2 服务的可观测性145
5.6 配置管理149
5.6.1 单一环境变量151
5.6.2 多环境变量151
5.6.3 将配置数据放入存储卷中152
5.6.4 密钥保存152
5.6.5 部署配置154
5.7 持续集成/持续交付流程示例156
5.8 本章小结159
第6章 最佳实践161
6.1 迈向云原生161
6.1.1 找个合理的理由打破巨石应用161
6.1.2 先解耦简单的服务162
6.1.3 学会小规模的运维162
6.1.4 使用防损层模式162
6.1.5 使用刀砍模式162
6.1.6 准备一个数据迁移策略164
6.1.7 重写所有模板代码164
6.1.8 重新考虑框架、语言、数据结构和数据存储164
6.1.9 淘汰老代码164
6.2 确保弹性164
6.2.1 用重试来解决瞬时故障165
6.2.2 使用有限次的重试165
6.2.3 用断路器来处理非瞬时故障166
6.2.4 优雅地降级166
6.2.5 使用隔离模式166
6.2.6 实现健康及就绪检查166
6.2.7 为容器设定CPU和内存限制166
6.2.8 实现限速和限流167
6.3 确保安全性167
6.3.1 安全性需求同其他需求一样重要167
6.3.2 在设计时就考虑安全性167
6.3.3 授予最小访问权限167
6.3.4 使用独立的账号、订阅和租客167
6.3.5 安全地存储所有密钥168
6.3.6 模糊化数据168
6.3.7 传输数据加密168
6.3.8 使用联合身份管理168
6.3.9 使用基于角色的访问控制168
6.3.10 Kubernetes pod的隔离169
6.4 处理数据169
6.4.1 使用托管数据库和数据分析服务169
6.4.2 使用最符合数据需求的存储169
6.4.3 将数据保存在多个地域或可用区中170
6.4.4 使用数据分区和复制以提高扩展性170
6.4.5 避免过度获取及频繁的I/O操作170
6.4.6 不要把业务逻辑放在数据库中执行170
6.4.7 使用类生产环境数据来测试170
6.4.8 处理瞬时故障171
6.5 性能和伸缩性171
6.5.1 设计可扩展的无状态服务171
6.5.2 使用平台的自动伸缩功能171
6.5.3 使用缓存172
6.5.4 用分区来实现超出服务限制的扩容172
6.6 函数计算172
6.6.1 编写单一用途的函数172
6.6.2 避免串联函数172
6.6.3 函数应保持轻量和简单173
6.6.4 实现无状态函数173
6.6.5 分离函数入口和函数的业务逻辑173
6.6.6 避免长时间运行的函数173
6.6.7 用队列解决跨函数通信问题173
6.7 运维173
6.7.1 部署和发布是两项独立的活动174
6.7.2 部署的内容要尽量小174
6.7.3 组件层级的CI/CD定义174
6.7.4 应用部署的一致性174
6.7.5 采用零宕机发布174
6.7.6 不要变更部署后的架构174
6.7.7 使用容器化构建175
6.7.8 用代码来描述基础设施175
6.7.9 使用命名空间来组织Kubernetes中的服务175
6.7.10 环境间的隔离175
6.7.11 分隔函数源代码175
6.7.12 关联代码提交和部署175
6.8 日志、监控及告警175
6.8.1 使用统一的日志系统176
6.8.2 使用关联ID176
6.8.3 在日志记录中包含上下文176
6.8.4 统一的结构化日志格式176
6.8.5 适当地标记指标176
6.8.6 避免告警疲劳177
6.8.7 定义基于重点性能指标的告警177
6.8.8 在生产环境中持续测试177
6.8.9 从基础的指标开始178
6.9 服务通信178
6.9.1 设计时考虑前后兼容性178
6.9.2 封装好服务避免泄露内部细节179
6.9.3 优先考虑异步通信179
6.9.4 使用高效的序列化技术179
6.9.5 使用队列和流来应对高负载和流量高峰180
6.9.6 用批处理来提高请求处理的效率180
6.9.7 拆分大的消息180
6.10 容器180
6.10.1 将镜像存储在可信的注册服务器中180
6.10.2 充分利用Docker的构建缓存181
6.10.3 不要使用特权模式运行容器181
6.10.4 使用显式的容器镜像标签181
6.10.5 保持小的容器镜像181
6.10.6 单个容器只运行一个应用182
6.10.7 使用可信镜像仓库中经过验证的镜像182
6.10.8 对镜像进行漏洞扫描182
6.10.9 不要将数据保存在容器中183
6.10.10 永远不要在容器中存放密钥和配置183
6.11 本章小结183
第7章 可移植性185
7.1 为什么要使应用可移植185
7.2 可移植性的代价186
7.3 何时及如何实现可移植性187
7.3.1 标准化的接口188
7.3.2 共用的服务和功能189
7.3.3 抽象和分层189
7.3.4 第三方服务商的托管服务191
7.3.5 可移植性工具192
7.3.6 把Kubernetes作为可移植性层194
7.4 本章小结196
上下滑动查看
●实拍●
点击链接了解详情并购买
更多精彩回顾
书讯 | 6月书讯 (上)| 初夏已至,书香有约,六月宜静心读书
书讯 | 6月书讯 (下)| 初夏已至,书香有约,六月宜静心读书
上新 | 周志华领衔撰写,历时4年,宝箱书问世!
书单 | 创建字节跳动之前,张一鸣读过哪些硬核技术书?
干货 | G1垃圾回收算法概述
收藏 | TIOBE 5月榜单:时隔五年,C语言重返第一