云原生:运用容器、函数计算和数据构建下一代应用
Boris Scholl, Trent Swanson, Peter Jausovec
季奔牛 译
出版时间:2020年05月
页数:197
开发者们刚开始接触云端服务开发的时候或多或少都会遇到一些障碍。既要学习分布式系统的知识,又要熟悉像容器和函数计算这样的新技术,还要综合运用这些知识来构建云原生应用实在是件令人望而生畏的事情。本书可以帮助你掌握构建云原生应用的方法,比如消息通信、事件通知和DevOps等。
本书介绍了构建现代云原生应用的架构模块。你将学会如何使用微服务、容器、无服务器架构、函数计算等技术,并挑选合适的存储类型,同时考虑可移植性等问题。你会从云原生应用的基础知识开始,一步步地了解设计、开发和运维云原生应用的整个过程。
● 探讨设计云原生应用所需的技术。
● 介绍容器和函数计算的区别,并学习它们的适用场景。
● 有针对性地设计应用来满足数据相关的需求。
● 学习DevOps的基础知识和一些开发、测试、运维实践。
● 学习一些构建和管理云原生应用的技巧、方法和实践。
● 理解构建一个具有可移植性的应用所需的代价,并且学会对需求做出取舍。
  1. 前言
  2. 第1章 云原生简介
  3. 1.1 分布式系统
  4. 1.1.1 分布式系统的误区
  5. 1.1.2 CAP定理
  6. 1.2 十二要素应用
  7. 1.3 可用性和服务等级协议
  8. 1.4 本章小结
  9. 第2章 云原生基础
  10. 2.1 容器
  11. 2.1.1 容器隔离等级
  12. 2.1.2 容器编排
  13. 2.1.3 Kubernetes概述
  14. 2.1.4 Kubernetes和容器
  15. 2.2 无服务器架构
  16. 2.3 函数计算
  17. 2.4 从虚拟机到云原生
  18. 2.4.1 提升和转变
  19. 2.4.2 应用的现代化改造
  20. 2.4.3 应用的优化
  21. 2.5 微服务
  22. 2.5.1 微服务架构的优势
  23. 2.5.2 微服务架构带来的挑战
  24. 2.6 本章小结
  25. 第3章 云原生应用的设计
  26. 3.1 云原生应用的基础
  27. 3.1.1 精益运营
  28. 3.1.2 安全性
  29. 3.1.3 可靠性与可用性
  30. 3.1.4 可扩展性与成本
  31. 3.2 云原生与传统架构的对比
  32. 3.3 函数计算与服务
  33. 3.3.1 函数计算的使用场景
  34. 3.3.2 使用函数计算的考虑因素
  35. 3.3.3 函数与服务的组合运用
  36. 3.4 API设计与版本控制
  37. 3.4.1 API的前后兼容
  38. 3.4.2 语义版本号
  39. 3.5 服务间的通信
  40. 3.5.1 通信协议
  41. 3.5.2 消息协议
  42. 3.5.3 序列化的考虑因素
  43. 3.5.4 幂等性
  44. 3.5.5 请求与响应
  45. 3.5.6 发布者与订阅者
  46. 3.5.7 发布者/订阅者模式与请求/响应模式间的选择
  47. 3.5.8 同步与异步
  48. 3.6 网关
  49. 3.6.1 路由
  50. 3.6.2 聚合
  51. 3.6.3 卸载
  52. 3.6.4 网关的实现
  53. 3.7 出口网关
  54. 3.8 服务网格
  55. 3.9 架构示例
  56. 3.10 本章小结
  57. 第4章 数据处理
  58. 4.1 数据存储系统
  59. 4.1.1 对象、文件和磁盘
  60. 4.1.2 数据库
  61. 4.1.3 流和队列
  62. 4.1.4 区块链
  63. 4.1.5 数据存储的选择
  64. 4.2 多数据存储下的数据
  65. 4.2.1 捕获数据更改
  66. 4.2.2 将更改作为事件写入更改日志
  67. 4.2.3 事务监管
  68. 4.2.4 事务回滚
  69. 4.2.5 提取、转换和加载
  70. 4.2.6 微服务和数据湖
  71. 4.3 客户端访问数据
  72. 4.3.1 受限的客户令牌(代客密钥)
  73. 4.3.2 细粒度访问控制的数据库服务
  74. 4.3.3 GraphQL数据服务
  75. 4.4 可快速伸缩的数据
  76. 4.4.1 数据分片
  77. 4.4.2 数据缓存
  78. 4.4.3 内容分发网络
  79. 4.5 数据分析
  80. 4.5.1 数据流
  81. 4.5.2 批处理
  82. 4.5.3 对象存储上的数据湖
  83. 4.5.4 数据湖和数据仓库
  84. 4.5.5 分布式查询引擎
  85. 4.6 Kubernetes中的数据库
  86. 4.6.1 存储卷
  87. 4.6.2 StatefulSet
  88. 4.6.3 DaemonSet
  89. 4.7 本章小结
  90. 第5章 DevOps
  91. 5.1 什么是DevOps
  92. 5.1.1 协作
  93. 5.1.2 自动化
  94. 5.1.3 精益原则和流程
  95. 5.1.4 度量
  96. 5.1.5 分享
  97. 5.2 测试
  98. 5.2.1 测试替身
  99. 5.2.2 自动化测试金字塔
  100. 5.2.3 不同测试类型的适用时机
  101. 5.2.4 测试节奏
  102. 5.2.5 在生产环境中测试
  103. 5.3 开发环境和工具
  104. 5.3.1 开发工具
  105. 5.3.2 开发环境
  106. 5.3.3 本地开发环境
  107. 5.3.4 本地开发环境结合远端集群
  108. 5.3.5 Skaffold开发工作流
  109. 5.3.6 将远端集群路由到本地开发环境
  110. 5.3.7 云端开发环境
  111. 5.4 持续集成/持续交付
  112. 5.4.1 源代码管理
  113. 5.4.2 构建阶段
  114. 5.4.3 测试阶段
  115. 5.4.4 部署阶段
  116. 5.4.5 发布阶段
  117. 5.4.6 发布后阶段
  118. 5.5 监控
  119. 5.5.1 收集指标
  120. 5.5.2 服务的可观测性
  121. 5.6 配置管理
  122. 5.6.1 单一环境变量
  123. 5.6.2 多环境变量
  124. 5.6.3 将配置数据放入存储卷中
  125. 5.6.4 密钥保存
  126. 5.6.5 部署配置
  127. 5.7 持续集成/持续交付流程示例
  128. 5.8 本章小结
  129. 第6章 佳实践
  130. 6.1 迈向云原生
  131. 6.1.1 找个合理的理由打破巨石应用
  132. 6.1.2 先解耦简单的服务
  133. 6.1.3 学会小规模的运维
  134. 6.1.4 使用防损层模式
  135. 6.1.5 使用刀砍模式
  136. 6.1.6 准备一个数据迁移策略
  137. 6.1.7 重写所有模板代码
  138. 6.1.8 重新考虑框架、语言、数据结构和数据存储
  139. 6.1.9 淘汰老代码
  140. 6.2 确保弹性
  141. 6.2.1 用重试来解决瞬时故障
  142. 6.2.2 使用有限次的重试
  143. 6.2.3 用断路器来处理非瞬时故障
  144. 6.2.4 优雅地降级
  145. 6.2.5 使用隔离模式
  146. 6.2.6 实现健康及就绪检查
  147. 6.2.7 为容器设定CPU和内存
  148. 6.2.8 实现限速和限流
  149. 6.3 确保安全性
  150. 6.3.1 安全性需求同其他需求一样重要
  151. 6.3.2 在设计时就考虑安全性
  152. 6.3.3 授予小访问权限
  153. 6.3.4 使用独立的账号、订阅和租客
  154. 6.3.5 安全地存储所有密钥
  155. 6.3.6 模糊化数据
  156. 6.3.7 传输数据加密
  157. 6.3.8 使用联合身份管理
  158. 6.3.9 使用基于角色的访问控制
  159. 6.3.10 Kubernetes pod的隔离
  160. 6.4 处理数据
  161. 6.4.1 使用托管数据库和数据分析服务
  162. 6.4.2 使用符合数据需求的存储
  163. 6.4.3 将数据保存在多个地域或可用区中
  164. 6.4.4 使用数据分区和复制以提高扩展性
  165. 6.4.5 避免过度获取及频繁的I/O操作
  166. 6.4.6 不要把业务逻辑放在数据库中执行
  167. 6.4.7 使用类生产环境数据来测试
  168. 6.4.8 处理瞬时故障
  169. 6.5 性能和伸缩性
  170. 6.5.1 设计可扩展的无状态服务
  171. 6.5.2 使用平台的自动伸缩功能
  172. 6.5.3 使用缓存
  173. 6.5.4 用分区来实现超出服务的扩容
  174. 6.6 函数计算
  175. 6.6.1 编写单一用途的函数
  176. 6.6.2 避免串联函数
  177. 6.6.3 函数应保持轻量和简单
  178. 6.6.4 实现无状态函数
  179. 6.6.5 分离函数入口和函数的业务逻辑
  180. 6.6.6 避免长时间运行的函数
  181. 6.6.7 用队列解决跨函数通信问题
  182. 6.7 运维
  183. 6.7.1 部署和发布是两项独立的活动
  184. 6.7.2 部署的内容要尽量小
  185. 6.7.3 组件层级的CI/CD定义
  186. 6.7.4 应用部署的一致性
  187. 6.7.5 采用零宕机发布
  188. 6.7.6 不要变更部署后的架构
  189. 6.7.7 使用容器化构建
  190. 6.7.8 用代码来描述基础设施
  191. 6.7.9 使用命名空间来组织Kubernetes中的服务
  192. 6.7.10 环境间的隔离
  193. 6.7.11 分隔函数源代码
  194. 6.7.12 关联代码提交和部署
  195. 6.8 日志、监控及告警
  196. 6.8.1 使用统一的日志系统
  197. 6.8.2 使用关联ID
  198. 6.8.3 在日志记录中包含上下文
  199. 6.8.4 统一的结构化日志格式
  200. 6.8.5 适当地标记指标
  201. 6.8.6 避免告警疲劳
  202. 6.8.7 定义基于重点性能指标的告警
  203. 6.8.8 在生产环境中持续测试
  204. 6.8.9 从基础的指标开始
  205. 6.9 服务通信
  206. 6.9.1 设计时考虑前后兼容性
  207. 6.9.2 封装好服务避免泄露内部细节
  208. 6.9.3 优先考虑异步通信
  209. 6.9.4 使用高效的序列化技术
  210. 6.9.5 使用队列和流来应对高负载和流量高峰
  211. 6.9.6 用批处理来提高请求处理的效率
  212. 6.9.7 拆分大的消息
  213. 6.10 容器
  214. 6.10.1 将镜像存储在可信的注册服务器中
  215. 6.10.2 充分利用Docker的构建缓存
  216. 6.10.3 不要使用特权模式运行容器
  217. 6.10.4 使用显式的容器镜像标签
  218. 6.10.5 保持小的容器镜像
  219. 6.10.6 单个容器只运行一个应用
  220. 6.10.7 使用可信镜像仓库中经过验证的镜像
  221. 6.10.8 对镜像进行漏洞扫描
  222. 6.10.9 不要将数据保存在容器中
  223. 6.10.10 永远不要在容器中存放密钥和配置
  224. 6.11 本章小结
  225. 第7章 可移植性
  226. 7.1 为什么要使应用可移植
  227. 7.2 可移植性的代价
  228. 7.2.1 数据引力和可移植性
  229. 7.3 何时及如何实现可移植性
  230. 7.3.1 标准化的接口
  231. 7.3.2 共用的服务和功能
  232. 7.3.3 抽象和分层
  233. 7.3.4 第三方服务商的托管服务
  234. 7.3.5 可移植性工具
  235. 7.3.6 把Kubernetes作为可移植性层
  236. 7.4 本章小结
书名:云原生:运用容器、函数计算和数据构建下一代应用
译者:季奔牛 译
国内出版社:机械工业出版社
出版时间:2020年05月
页数:197
书号:978-7-111-65324-0
原版书书名:Cloud Native
原版书出版商:O'Reilly Media
Boris Scholl
 
Boris Scholl是Azure计算团队的产品架构师,专注于下一代分布式系统平台和应用程序模型的研究。
 
 
Trent Swanson
 
Trent Swanson是Full Scale 180的联合创始人和顾问。他帮助了不少微软的大客户把应用迁移上云,或在云中构建应用。
 
 
Peter Jausovec
 
Peter Jausovec是一名软件工程师,在软件开发和技术领域有10多年的经验。
 
 
购买选项
定价:79.00元
书号:978-7-111-65324-0
出版社:机械工业出版社