| 作者 |
| 吉吉·赛凡 克里斯·理查森 |
| 丛书名 |
| 云计算与虚拟化技术丛书 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9782006091045 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------Kubernetes微服务实战--------------------------- 本书深入介绍Kubernetes和微服务之间的协同关系。首先介绍如何使用示例应用程序Delinkcious,它将作为贯穿全书的动手实验,帮助读者在实际应用程序的上下文中理解微服务和Kubernetes的概念。接下来,介绍了如何设置CI/CD流水线以及使用Kubernetes ConfigMap配置微服务。然后介绍微服务安全和实现REST、gRPC API和Delinkcious数据存储的实践。除此之外,本书还探索了Nuclio项目,介绍如何在Kubernetes上运行一个无服务器任务,并管理和实现数据密集型测试。在最后几章中,你将在Kubernetes上部署微服务,并学习如何做好系统的监控。最后,你将逐渐发现服务网格的重要性,以及如何将Istio集成到Delinkcious集群中。 ---------------------------微服务架构设计模式--------------------------- 本书共13章,第1章引入了微服务架构模式语言的概述;第2章解释了为什么软件架构很重要,并描述了可用于将应用程序分解为服务的模式;第3章介绍了微服务架构中强大的进程间通信的几种模式;第4章介绍Saga模式;第5章介绍领域驱动设计(DDD)的聚合和领域事件等模式的使用;第6章介绍如何使用事件溯源模式;第7章介绍如何使用 API 组合模式或命令查询责任隔离(CQRS)模式;第8章介绍外部 API 模式;第9章和第10章介绍微服务自动化测试技术;第11章介绍开发生产就绪服务的各个方面;第12章介绍部署模式;第13章介绍绞杀者模式。 |
| 目录 |
---------------------------Kubernetes微服务实战--------------------------- 译者序 前言 关于评审者 第1章 面向开发人员的Kubernetes简介 1 1.1 技术需求 1 1.1.1 安装Docker 1 1.1.2 安装kubectl 2 1.1.3 安装Minikube 2 1.1.4 本章代码 2 1.2 Kubernetes简介 2 1.2.1 容器编排平台 2 1.2.2 Kubernetes发展历史 2 1.2.3 Kubernetes现状 3 1.3 Kubernetes架构 3 1.3.1 控制平面 4 1.3.2 数据平面 5 1.4 微服务的完美搭档 6 1.4.1 微服务打包和部署 6 1.4.2 微服务公开和发现 8 1.4.3 微服务安全 9 1.4.4 微服务验证和授权 11 1.4.5 微服务升级 12 1.5 创建本地集群 14 1.5.1 安装Minikube 14 1.5.2 探索集群 16 1.5.3 安装Helm 17 1.6 小结 19 1.7 扩展阅读 19 第2章 微服务入门 20 2.1 技术需求 21 2.1.1 在macOS上通过Homebrew安装Go 21 2.1.2 在其他平台上安装Go 21 2.1.3 本章代码 21 2.2 微服务编程—少即是多 21 2.3 微服务自治 23 2.4 使用接口和契约 23 2.5 通过API公开服务 24 2.6 使用客户端库 24 2.7 管理依赖 25 2.8 协调微服务 25 2.9 利用所有权 26 2.10 理解康威定律 27 2.10.1 垂直组织 27 2.10.2 水平组织 28 2.10.3 矩阵组织 28 2.11 跨服务故障排除 28 2.12 利用共享服务库 29 2.13 选择源代码控制策略 29 2.13.1 单体仓库 29 2.13.2 多仓库 30 2.13.3 混合模式 30 2.14 选择数据策略 30 2.14.1 每个微服务对应一个数据存储 31 2.14.2 运行分布式查询 31 2.14.3 使用Saga模式管理跨服务事务 33 2.15 小结 35 2.16 扩展阅读 36 第3章 示例应用程序—Delinkcious 37 3.1 技术需求 37 3.1.1 Visual Studio Code 38 3.1.2 GoLand 38 3.1.3 LiteIDE 38 3.1.4 其他选项 38 3.1.5 本章代码 38 3.2 为什么选择Go 39 3.3 认识Go kit 39 3.3.1 使用Go kit构建微服务 40 3.3.2 理解传输 41 3.3.3 理解端点 41 3.3.4 理解服务 42 3.3.5 理解中间件 42 3.3.6 理解客户端 43 3.3.7 生成样板 43 3.4 Delinkcious结构 43 3.4.1 cmd子 44 3.4.2 pkg子 44 3.4.3 svc子 45 3.5 Delinkcious微服务 45 3.5.1 对象模型 46 3.5.2 服务实现 47 3.5.3 支持函数实现 50 3.5.4 通过客户端库调用API 53 3.6 数据存储 56 3.7 小结 58 3.8 扩展阅读 58 第4章 构建CI/CD流水线 59 4.1 技术需求 59 4.2 理解CI/CD流水线 60 4.3 选择CI/CD流水线工具 61 4.4.1 Jenkins X 61 4.4.2 Spinnaker 62 4.4.3 Travis CI和CircleCI 62 4.4.4 Tekton 62 4.4.5 Argo CD 63 4.4.6 自研工具 63 4.4 GitOps 63 4.5 使用CircleCI构建镜像 64 4.5.1 查看源代码树 64 4.5.2 配置CI流水线 65 4.5.3 理解构建脚本 66 4.5.4 使用多阶段Dockerfile对Go服务容器化 68 4.5.5 探索CircleCI界面 68 4.5.6 未来的改进 71 4.6 为Delinkcious设置持续交付 71 4.6.1 部署Delinkcious微服务 71 4.6.2 理解Argo CD 72 4.6.3 Argo CD入门 73 4.6.4 配置Argo CD 75 4.6.5 探索Argo CD 77 4.7 小结 80 4.8 扩展阅读 81 第5章 使用Kubernetes配置微服务 82 5.1 技术需求 82 5.2 配置包含的内容 83 5.3 通过传统方式管理配置 83 5.3.1 约定 84 5.3.2 命令行标志 85 5.3.3 环境变量 85 5.3.4 配置文件 86 5.3.5 混合配置和默认 90 5.3.6 12-Factor应用程序配置 91 5.4 动态管理配置 92 5.4.1 理解动态配置 92 5.4.2 远程配置存储 93 5.4.3 远程配置服务 93 5.5 使用Kubernetes配置微服务 93 5.5.1 使用Kubernetes ConfigMaps 94 5.5.2 Kubernetes自定义资源 102 5.5.3 服务发现 105 5.6 小结 105 5.7 扩展阅读 106 第6章 Kubernetes与微服务安全 107 6.1 技术需求 107 6.2 应用完善的安全原则 108 6.3 区分用户账户和服务账户 110 6.3.1 用户账户 110 6.3.2 服务账户 111 6.4 使用Kubernetes管理密钥 114 6.4.1 Kubernetes密钥的三种类型 114 6.4.2 创造自己的密钥 115 6.4.3 将密钥传递到容器 116 6.4.4 构建一个安全的Pod 117 6.5 使用RBAC管理权限 118 6.6 通过认证、授权和准入控制访问权限 121 6.6.1 认证 121 6.6.2 授权 125 6.6.3 准入 125 6.7 通过安全最佳实践增强Kubernetes 126 6.7.1 镜像安全 126 6.7.2 网络安全—分而治之 127 6.7.3 镜像仓库安全 129 6.7.4 按需授予访问权限 129 6.7.5 使用配额最小化爆炸半径 130 6.7.6 实施安全上下文 132 6.7.7 使用安全策略强化Pod 133 6.7.8 强化工具链 134 6.8 小结 135 6.9 扩展阅读 136 第7章 API与负载均衡器 137 7.1 技术需求 137 7.2 熟悉Kubernetes服务 138 7.3 东西流量与南北流量 140 7.4 理解ingress和负载均衡器 141 7.5 提供和使用公有REST API 141 7.5.1 构建基于Python的API网关服务 141 7.5.2 添加ingress 146 7.5.3 验证API网关 147 7.6 提供和使用内部gRPC API 150 7.6.1 定义NewsManager接口 150 7.6.2 实现消息管理器 151 7.6.3 将NewsManager公开为gRPC服务 153 7.7 通过消息队列发送和接收事件 158 7.7.1 NATS 159 7.7.2 在Kubernetes集群中部署NATS 159 7.7.3 使用NATS发送链接事件 160 7.7.4 订阅NATS链接事件 162 7.7.5 处理链接事件 164 7.8 服务网格 166 7.9 小结 166 7.10 扩展阅读 166 第8章 有状态服务 167 8.1 技术需求 167 8.2 抽象存储 168 8.2.1 Kubernetes存储模型 168 8.2.2 内置和外部存储插件 172 8.2.3 理解CSI 173 8.3 在Kubernetes集群外存储数据 174 8.4 使用StatefulSet在Kubernetes集群内存储数据 175 8.4.1 理解StatefulSet 175 8.4.2 什么时候应该使用StatefulSet 178 8.4.3 一个大型StatefulSet示例 179 8.5 通过本地存储实现高性能 183 8.5.1 将数据存储在内存中 183 8.5.2 将数据存储在本地SSD硬盘上 183 8.6 在Kubernetes中使用关系型数据库 183 8.6.1 了解数据的存储位置 184 8.6.2 使用部署和服务 184 8.6.3 使用StatefulSet 185 8.6.4 帮助用户服务找到StatefulSet Pod 185 8.6.5 管理模式更改 187 8.7 在Kubernetes中使用非关系型数据存储 187 8.8 小结 191 8.9 扩展阅读 192 第9章 在Kubernetes上运行Serverless任务 193 9.1 技术需求 193 9.2 云中的Serverless 194 9.2.1 微服务与Serverless函数 195 9.2.2 在Kubernetes上的Serverless函数模型 195 9.2.3 构建、配置和部署Serverless函数 196 9.2.4 调用Serverless函数 196 9.3 Delinkcious链接检查 196 9.3.1 设计链接检查 197 9.3.2 实现链接检查 199 9.4 使用Nuclio实现Serverless链接检查 202 9.4.1 Nuclio简介 202 9.4.2 创建一个链接检查Serverless函数 203 9.4.3 使用nuctl部署链接检查函数 206 9.4.4 使用Nuclio仪表板部署函数 207 9.4.5 直接调用链接检查函数 207 9.4.6 在LinkManager中触发链接检查 208 9.5 其他Kubernetes Serverless框架 209 9.5.1 Kubernetes Job和CronJob 210 9.5.2 KNative 210 9.5.3 Fission 211 9.5.4 Kubeless 211 9.5.5 OpenFaas 211 9.6 小结 212 9.7 扩展阅读 212 第10章 微服务测试 213 10.1 技术需求 214 10.2 单元测试 214 10.2.1 使用Go进行单元测试 214 10.2.2 使用Ginkgo和Gomega进行单元测试 216 10.2.3 Delinkcious单元测试 217 10.2.4 模拟的艺术 217 10.2.5 你应该测试一切吗 221 10.3 集成测试 222 10.3.1 初始化测试数据库 222 10.3.2 运行服务 223 10.3.3 运行实际测试 223 10.3.4 实现数据库测试辅助函数 225 10.3.5 实现服务测试辅助函数 227 10.4 使用Kubernetes进行本地测试 229 10.4.1 编写冒烟测试 229 10.4.2 Telepresence 232 10.5 隔离测试 235 10.5.1 隔离集群 236 10.5.2 隔离命名空间 236 10.5.3 跨集群/命名空间 237 10.6 端到端测试 237 10.6.1 验收测试 237 10.6.2 回归测试 238 10.6.3 性能测试 238 10.7 管理测试数据 239 10.7.1 合成数据 239 10.7.2 人工测试数据 239 10.7.3 生产环境快照 239 10.8 小结 240 10.9 扩展阅读 240 第11章 微服务部署 241 11.1 技术需求 241 11.2 Kubernetes部署 242 11.3 多环境部署 243 11.4 理解部署策略 246 11.4.1 重新部署 247 11.4.2 滚动更新 247 11.4.3 蓝绿部署 248 11.4.4 金丝雀部署 255 11.5 回滚部署 260 11.5.1 回滚标准部署 260 11.5.2 回滚蓝绿部署 261 11.5.3 回滚金丝雀部署 262 11.5.4 回滚模式、API或负载的更改 262 11.6 管理版本和依赖 263 11.6.1 管理公有API接口 263 11.6.2 管理跨服务依赖 264 11.6.3 管理第三方依赖 264 11.6.4 管理基础设施和工具链 265 11.7 本地开发部署 265 11.7.1 Ko 266 11.7.2 Ksync 269 11.7.3 Draft 271 11.7.4 Skaffold 272 11.7.5 Tilt 273 11.8 小结 279 11.9 扩展阅读 279 第12章 监控、日志和指标 280 12.1 技术需求 281 12.2 Kubernetes的自愈能力 281 12.2.1 容器故障 282 12.2.2 节点故障 282 12.2.3 系统故障 283 12.3 Kubernetes集群自动伸缩 284 12.3.1 Pod水平自动伸缩 284 12.3.2 集群自动伸缩 286 12.3.3 Pod垂直自动伸缩 287 12.4 使用Kubernetes供应资源 289 12.4.1 应该提供哪些资源 289 12.4.2 定义容器限制 289 12.4.3 指定资源配额 290 12.4.4 手动供应 291 12.4.5 利用自动伸缩 292 12.4.6 自定义自动供应 292 12.5 正确地优化性能 292 12.5.1 性能和用户体验 292 12.5.2 性能和高可用性 293 12.5.3 性能和成本 293 12.5.4 性能和安全性 293 12.6 日志 294 12.6.1 日志应该记录什么 294 12.6.2 日志与错误报告 294 12.6.3 Go日志接口 294 12.6.4 使用Go-kit日志 295 12.6.5 使用Kubernetes集中管理日志 298 12.7 在Kubernetes上收集指标 299 12.7.1 Kubernetes指标API 300 12.7.2 Kubernetes指标服务器 301 12.7.3 使用Prometheus 302 12.8 警报 308 12.8.1 拥抱组件故障 309 12.8.2 接受系统故障 309 12.8.3 考虑人为因素 309 12.8.4 使用Prometheus警报管理器 310 12.9 分布式跟踪 312 12.9.1 安装Jaeger 312 12.9.2 将跟踪集成到服务中 313 12.10 小结 315 12.11 扩展阅读 315 第13章 服务网格与Istio 317 13.1 技术需求 317 13.2 服务网格 318 13.2.1 单体架构与微服务架构 319 13.2.2 使用共享库管理微服务的横切关注点 319 13.2.3 使用服务网格管理微服务的横切关注点 320 13.2.4 理解Kubernetes与服务网格之间的关系 320 13.3 Istio 321 13.3.1 了解Istio架构 321 13.3.2 使用Istio管理流量 324 13.3.3 使用Istio保护集群 328 13.3.4 使用Istio实施策略 331 13.3.5 使用Istio收集指标 331 13.3.6 什么时候应该避免使用Istio 332 13.4 基于Istio构建Delinkcious 333 13.4.1 简化服务间的认证 333 13.4.2 优化金丝雀部署 335 13.4.3 自动化的日志管理和错误报告 336 13.4.4 兼容NATS 338 13.4.5 查看Istio足迹 338 13.5 Istio的替代方案 341 13.5.1 Linkerd 2.0 341 13.5.2 Envoy 341 13.5.3 HashiCorp Consul 341 13.5.4 AWS App Mesh 342 13.5.5 其他 342 13.5.6 不使用服务网格 342 13.6 小结 342 13.7 扩展阅读 343 第14章 微服务和Kubernetes的未来 344 14.1 微服务的未来 345 14.1.1 微服务与无服务器函数 345 14.1.2 微服务、容器和编排 345 14.1.3 gRPC和gRPC-Web 346 14.1.4 GraphQL 346 14.1.5 HTTP/3 346 14.2 Kubernetes的未来 347 14.2.1 Kubernetes的可扩展性 348 14.2.2 服务网格集成 349 14.2.3 Kubernetes上的无服务器计算 350 14.2.4 Kubernetes和VM 351 14.2.5 集群自动伸缩 352 14.2.6 使用Operator 353 14.2.7 集群联邦 354 14.3 小结 355 14.4 扩展阅读 355 ---------------------------微服务架构设计模式--------------------------- 写给中文版读者的话 译者序 中文版序一 中文版序二 前言 引言 第1章 逃离单体地狱 / 1 1.1 迈向单体地狱的漫长旅程 / 2 1.1.1 FTGO应用程序的架构 / 3 1.1.2 单体架构的好处 / 4 1.1.3 什么是单体地狱 / 4 1.2 为什么本书与你有关 / 7 1.3 你会在本书中学到什么 / 8 1.4 拯救之道:微服务架构 / 8 1.4.1 扩展立方体和服务 / 9 1.4.2 微服务架构作为模块化的一种形式 / 11 1.4.3 每个服务都拥有自己的数据库 / 12 1.4.4 FTGO的微服务架构 / 12 1.4.5 微服务架构与SOA的异同 / 14 1.5 微服务架构的好处和弊端 / 15 1.5.1 微服务架构的好处 / 15 1.5.2 微服务架构的弊端 / 17 1.6 微服务架构的模式语言 / 19 1.6.1 微服务架构并不是“银弹” / 20 1.6.2 模式和模式语言 / 21 1.6.3 微服务架构的模式语言概述 / 24 1.7 微服务之上:流程和组织 / 29 1.7.1 进行软件开发和交付的组织 / 30 1.7.2 进行软件开发和交付的流程 / 31 1.7.3 采用微服务架构时的人为因素 / 32 第2章 服务的拆分策略 / 34 2.1 微服务架构到底是什么 / 35 2.1.1 软件架构是什么,为什么它如此重要 / 35 2.1.2 什么是架构的风格 / 37 2.1.3 微服务架构是一种架构风格 / 40 2.2 为应用程序定义微服务架构 / 43 2.2.1 识别系统操作 / 45 2.2.2 根据业务能力进行服务拆分 / 50 2.2.3 根据子域进行服务拆分 / 53 2.2.4 拆分的指导原则 / 54 2.2.5 拆分单体应用为服务的难点 / 56 2.2.6 定义服务API / 59 第3章 微服务架构中的进程间通信 / 63 3.1 微服务架构中的进程间通信概述 / 64 3.1.1 交互方式 / 64 3.1.2 在微服务架构中定义API / 66 3.1.3 API的演化 / 67 3.1.4 消息的格式 / 69 3.2 基于同步远程过程调用模式的通信 / 70 3.2.1 使用REST / 71 3.2.2 使用gRPC / 74 3.2.3 使用断路器模式处理局部故障 / 75 3.2.4 使用服务发现 / 78 3.3 基于异步消息模式的通信 / 82 3.3.1 什么是消息传递 / 83 3.3.2 使用消息机制实现交互方式 / 84 3.3.3 为基于消息机制的服务API创建API规范 / 86 3.3.4 使用消息代理 / 87 3.3.5 处理并发和消息顺序 / 91 3.3.6 处理重复消息 / 92 3.3.7 事务性消息 / 93 3.3.8 消息相关的类库和框架 / 97 3.4 使用异步消息提高可用性 / 99 3.4.1 同步消息会降低可用性 / 99 3.4.2 消除同步交互 / 101 第4章 使用Saga管理事务 / 106 4.1 微服务架构下的事务管理 / 107 4.1.1 微服务架构对分布式事务的需求 / 108 4.1.2 分布式事务的挑战 / 109 4.1.3 使用Saga模式维护数据一致性 / 109 4.2 Saga的协调模式 / 113 4.2.1 协同式Saga / 113 4.2.2 编排式Saga / 117 4.3 解决隔离问题 / 121 4.3.1 缺乏隔离导致的问题 / 122 4.3.2 Saga模式下实现隔离的对策 / 123 4.4 Order Service和Create Order Saga的设计 / 127 4.4.1 OrderService类 / 128 4.4.2 Create Order Saga的实现 / 129 4.4.3 OrderCommandHandlers类 / 136 4.4.4 OrderServiceConfiguration类 / 138 第5章 微服务架构中的业务逻辑设计 / 141 5.1 业务逻辑组织模式 / 142 5.1.1 使用事务脚本模式设计业务逻辑 / 143 5.1.2 使用领域模型模式设计业务逻辑 / 144 5.1.3 关于领域驱动设计 / 146 5.2 使用聚合模式设计领域模型 / 146 5.2.1 模糊边界所带来的问题 / 147 5.2.2 聚合拥有明确的边界 / 149 5.2.3 聚合的规则 / 150 5.2.4 聚合的颗粒度 / 152 5.2.5 使用聚合设计业务逻辑 / 153 5.3 发布领域事件 / 154 5.3.1 为什么需要发布变更事件 / 154 5.3.2 什么是领域事件 / 155 5.3.3 事件增强 / 155 5.3.4 识别领域事件 / 156 5.3.5 生成和发布领域事件 / 157 5.3.6 消费领域事件 / 161 5.4 Kitchen Service的业务逻辑 / 162 5.5 Order Service的业务逻辑 / 167 5.5.1 Order聚合 / 169 5.5.2 OrderService类 / 173 第6章 使用事件溯源开发业务逻辑 / 176 6.1 使用事件溯源开发业务逻辑概述 / 177 6.1.1 传统持久化技术的问题 / 177 6.1.2 什么是事件溯源 / 179 6.1.3 使用乐观锁处理并发更新 / 186 6.1.4 事件溯源和发布事件 / 186 6.1.5 使用快照提升性能 / 188 6.1.6 幂等方式的消息处理 / 189 6.1.7 领域事件的演化 / 190 6.1.8 事件溯源的好处 / 192 6.1.9 事件溯源的弊端 / 193 6.2 实现事件存储库 / 194 6.2.1 Eventuate Local事件存储库的工作原理 / 195 6.2.2 Eventuate的Java客户端框架 / 198 6.3 同时使用Saga和事件溯源 / 201 6.3.1 使用事件溯源实现协同式Saga / 203 6.3.2 创建编排式Saga / 203 6.3.3 实现基于事件溯源的Saga参与方 / 205 6.3.4 实现基于事件溯源的Saga编排器 / 208 第7章 在微服务架构中实现查询 / 212 7.1 使用API组合模式进行查询 / 213 7.1.1 findOrder()查询操作 / 213 7.1.2 什么是API组合模式 / 214 7.1.3 使用API组合模式实现findOrder()查询操作 / 215 7.1.4 API组合模式的设计缺陷 / 216 7.1.5 API组合模式的好处和弊端 / 219 7.2 使用CQRS模式 / 220 7.2.1 为什么要使用CQRS / 220 7.2.2 什么是CQRS / 223 7.2.3 CQRS的好处 / 226 7.2.4 CQRS的弊端 / 227 7.3 设计CQRS视图 / 228 7.3.1 选择视图存储库 / 229 7.3.2 设计数据访问模块 / 230 7.3.3 添加和更新CQRS视图 / 232 7.4 实现基于AWS DynamoDB的CQRS视图 / 233 7.4.1 OrderHistoryEventHandlers模块 / 234 7.4.2 DynamoDB中的数据建模和查询设计 / 235 7.4.3 OrderHistoryDaoDynamoDb类 / 239 第8章 外部API模式 / 244 8.1 外部API的设计难题 / 245 8.1.1 FTGO移动客户端API的设计难题 / 246 8.1.2 其他类型客户端API的设计难题 / 248 8.2 API Gateway模式 / 250 8.2.1 什么是API Gateway模式 / 250 8.2.2 API Gateway模式的好处和弊端 / 256 8.2.3 以Netflix为例的API Gateway / 257 8.2.4 API Gateway的设计难题 / 258 8.3 实现一个API Gateway / 260 8.3.1 使用现成的API Gateway产品或服务 / 261 8.3.2 开发自己的API Gateway / 262 8.3.3 使用GraphQL实现API Gateway / 269 第9章 微服务架构中的测试策略(上) / 282 9.1 微服务架构中的测试策略概述 / 284 9.1.1 什么是测试 / 284 9.1.2 微服务架构中的测试挑战 / 289 9.1.3 部署流水线 / 295 9.2 为服务编写单元测试 / 296 9.2.1 为实体编写单元测试 / 298 9.2.2 为值对象编写单元测试 / 299 9.2.3 为Saga编写单元测试 / 300 9.2.4 为领域服务编写单元测试 / 302 9.2.5 为控制器编写单元测试 / 303 9.2.6 为事件和消息处理程序编写单元测试 / 305 第10章 微服务架构中的测试策略(下) / 308 10.1 编写集成测试 / 308 10.1.1 针对持久化层的集成测试 / 311 10.1.2 针对基于REST的请求/响应式交互的集成测试 / 312 10.1.3 针对发布/订阅式交互的集成测试 / 316 10.1.4 针对异步请求/响应式交互的集成契约测试 / 320 10.2 编写组件测试 / 324 10.2.1 定义验收测试 / 325 10.2.2 使用Gherkin编写验收测试 / 326 10.2.3 设计组件测试 / 328 10.2.4 为FTGO的Order Service编写组件测试 / 330 10.3 端到端测试 / 334 10.3.1 设计端到端测试 / 335 10.3.2 编写端到端测试 / 335 10.3.3 运行端到端测试 / 336 第11章 开发面向生产环境的微服务应用 / 338 11.1 开发安全的服务 / 339 11.1.1 传统单体应用程序的安全性 / 340 11.1.2 在微服务架构中实现安全性 / 343 11.2 设计可配置的服务 / 349 11.2.1 使用基于推送的外部化配置 / 350 11.2.2 使用基于拉取的外部化配置 / 352 11.3 设计可观测的服务 / 353 11.3.1 使用健康检查API模式 / 355 11.3.2 使用日志聚合模式 / 357 11.3.3 使用分布式追踪模式 / 358 11.3.4 使用应用程序指标模式 / 361 11.3.5 使用异常追踪模式 / 364 11.3.6 使用审计日志模式 / 365 11.4 使用微服务基底模式开发服务 / 367 11.4.1 使用微服务基底 / 368 11.4.2 从微服务基底到服务网格 / 368 第12章 部署微服务应用 / 371 12.1 部署模式:编程语言特定的发布包格式 / 374 12.1.1 使用编程语言特定的发布包格式进行部署的好处 / 376 12.1.2 使用编程语言特定的发布包格式进行部署的弊端 / 377 12.2 部署模式:将服务部署为虚拟机 / 378 12.2.1 将服务部署为虚拟机的好处 / 380 12.2.2 将服务部署为虚拟机的弊端 / 380 12.3 部署模式:将服务部署为容器 / 381 12.3.1 使用Docker部署服务 / 383 12.3.2 将服务部署为容器的好处 / 385 12.3.3 将服务部署为容器的弊端 / 386 12.4 使用Kubernetes部署FTGO应用程序 / 386 12.4.1 什么是Kubernetes / 386 12.4.2 在Kubernetes上部署Restaurant Service / 389 12.4.3 部署API Gateway / 392 12.4.4 零停机部署 / 393 12.4.5 使用服务网格分隔部署与发布流程 / 394 12.5 部署模式:Serverless部署 / 402 12.5.1 使用AWS Lambda进行Serverless部署 / 403 12.5.2 开发Lambda函数 / 404 12.5.3 调用Lambda函数 / 404 12.5.4 使用Lambda函数的好处 / 405 12.5.5 使用Lambda函数的弊端 / 406 12.6 使用AWS Lambda和AWS Gateway部署RESTful服务 / 406 12.6.1 AWS Lambda版本的Restaurant Service / 407 12.6.2 把服务打包为ZIP文件 / 411 12.6.3 使用Serverless框架部署Lambda函数 / 412 第13章 微服务架构的重构策略 / 415 13.1 重构到微服务需要考虑的问题 / 416 13.1.1 为什么要重构单体应用 / 416 13.1.2 绞杀单体应用 / 417 13.2 将单体应用重构为微服务架构的若干策略 / 420 13.2.1 将新功能实现为服务 / 420 13.2.2 隔离表现层与后端 / 422 13.2.3 提取业务能力到服务中 / 423 13.3 设计服务与单体的协作方式 / 429 13.3.1 设计集成胶水 / 430 13.3.2 在服务和单体之间维持数据一致性 / 434 13.3.3 处理身份验证和访问授权 / 438 13.4 将新功能实现为服务:处理错误配送订单 / 440 13.4.1 Delayed Delivery Service的设计 / 441 13.4.2 为Delayed Delivery Service设计集成胶水 / 442 13.5 从单体中提取送餐管理功能 / 444 13.5.1 现有的送餐管理功能 / 444 13.5.2 Delivery Service概览 / 446 13.5.3 设计Delivery Service的领域模型 / 447 13.5.4 Delivery Service集成胶水的设计 / 450 13.5.5 修改FTGO单体使其能够与Delivery Service交互 / 451 |