第一部分 概述
第1章 微服务的设计与运行 3
1.1 什么是微服务应用 4
1.1.1 通过分解来实现扩展 6
1.1.2 核心原则 7
1.1.3 谁在使用微服务 9
1.1.4 为什么微服务是一个明智的选择 10
1.2 微服务的挑战 12
1.2.1 设计挑战 13
1.2.2 运维挑战 15
1.3 微服务开发生命周期 16
1.3.1 微服务设计 17
1.3.2 微服务部署 18
1.3.3 服务监控 21
1.4 有责任感和运维意识的工程师文化 22
1.5 小结 23
第2章 SimpleBank公司的微服务 24
2.1 SimpleBank公司的业务范围 24
2.2 微服务是否是正确的选择 25
2.2.1 金融软件的风险和惰性 26
2.2.2 减少阻力和持续交付价值 27
2.3 开发新功能 27
2.3.1 通过领域建模识别微服务 28
2.3.2 服务协作 30
2.3.3 服务编排 32
2.4 向外界开放服务 34
2.5 将功能发布到生产环境中 35
2.5.1 高质量的自动化部署 37
2.5.2 可恢复性 37
2.5.3 透明性 38
2.6 大规模微服务开发 39
2.6.1 技术分歧 40
2.6.2 孤立 40
2.7 接下来的内容 41
2.8 小结 41
第二部分 设计
第3章 微服务应用的架构 45
3.1 整体架构 45
3.1.1 从单体应用到微服务 46
3.1.2 架构师的角色 47
3.1.3 架构准则 47
3.1.4 微服务应用的4层架构 48
3.2 微服务平台 49
3.3 服务层 51
3.3.1 功能 51
3.3.2 聚合与多元服务 52
3.3.3 关键路径和非关键路径 53
3.4 通信 54
3.4.1 何时使用同步消息 54
3.4.2 何时使用异步消息 55
3.4.3 异步通信模式 55
3.4.4 服务定位 57
3.5 服务边界 58
3.5.1 API网关 60
3.5.2 服务于前端的后端 61
3.5.3 消费者驱动网关 62
3.6 客户端 63
3.6.1 前端单体 63
3.6.2 微前端 64
3.7 小结 65
第4章 新功能设计 66
4.1 SimpleBank的新功能 67
4.2 按业务能力划分 68
4.2.1 能力和领域建模 69
4.2.2 创建投资策略 70
4.2.3 内嵌型上下文和服务 75
4.2.4 挑战和不足 76
4.3 按用例划分 77
4.3.1 按投资策略下单 77
4.3.2 动作和存储 82
4.3.3 编配与编排 83
4.4 按易变性划分 84
4.5 按技术能力划分 85
4.5.1 发送通知 85
4.5.2 何时使用技术能力 86
4.6 处理不确定性 87
4.6.1 从粗粒度服务开始 88
4.6.2 准备进一步分解 88
4.6.3 下线和迁移 89
4.7 组织中的服务所有权 91
4.8 小结 92
第5章 微服务的事务与查询 93
5.1 分布式应用的事务一致性 94
5.2 基于事件的通信 96
5.3 Saga 98
5.3.1 编排型Saga 100
5.3.2 编配型Saga 102
5.3.3 交织型Saga 104
5.3.4 一致性模式 105
5.3.5 事件溯源 106
5.4 分布式世界中的查询操作 107
5.4.1 保存数据副本 108
5.4.2 查询和命令分离 110
5.4.3 CQRS挑战 112
5.4.4 分析和报表 114
5.5 延伸阅读 114
5.6 小结 114
第6章 设计高可靠服务 116
6.1 可靠性定义 117
6.2 哪些会出错 119
6.2.1 故障源 119
6.2.2 连锁故障 122
6.3 设计可靠的通信方案 125
6.3.1 重试 126
6.3.2 后备方案 128
6.3.3 超时 130
6.3.4 断路器 132
6.3.5 异步通信 134
6.4 最大限度地提高服务可靠性 135
6.4.1 负载均衡与服务健康 135
6.4.2 限流 136
6.4.3 验证可靠性和容错性 137
6.5 默认安全 140
6.5.1 框架 140
6.5.2 服务网格 141
6.6 小结 142
第7章 构建可复用的微服务框架 143
7.1 微服务底座 144
7.2 微服务底座的目的 146
7.2.1 降低风险 147
7.2.2 快速启动 147
7.3 设计服务底座 148
7.3.1 服务发现 149
7.3.2 可观测性 153
7.3.3 平衡和限流 159
7.4 探索使用底座实现的特性 161
7.5 差异性是否是微服务的承诺 163
7.6 小结 164
第三部分 部署
第8章 微服务部署 167
8.1 部署的重要性 167
8.2 微服务生产环境 169
8.2.1 微服务生产环境的特点 169
8.2.2 自动化和速度 170
8.3 部署服务的快捷方式 171
8.3.1 服务启动 171
8.3.2 配置虚拟机 172
8.3.3 运行多个服务实例 173
8.3.4 添加负载均衡器 175
8.3.5 开发者学到了什么 177
8.4 构建服务工件 178
8.4.1 工件的组成 179
8.4.2 不可变性 179
8.4.3 服务工件的类型 180
8.4.4 配置 184
8.5 服务与主机关系模型 185
8.5.1 单服务主机 185
8.5.2 单主机多静态服务 185
8.5.3 单主机多调度化服务 186
8.6 不停机部署服务 187
8.7 小结 190
第9章 基于容器和调度器的部署 191
9.1 服务容器化 192
9.1.1 镜像使用 192
9.1.2 构建镜像 194
9.1.3 运行容器 197
9.1.4 镜像存储 199
9.2 集群部署 200
9.2.1 pod的设计与运行 201
9.2.2 负载均衡 204
9.2.3 快速揭秘 205
9.2.4 健康检查 208
9.2.5 部署新版本服务 210
9.2.6 回滚 215
9.2.7 连接多个服务 215
9.3 小结 216
第10章 构建微服务交付流水线 217
10.1 让部署变得平淡 217
10.2 使用Jenkins构建流水线 219
10.2.1 构建流水线配置 220
10.2.2 构建镜像 223
10.2.3 运行测试 224
10.2.4 发布工件 226
10.2.5 部署到预发布环境 227
10.2.6 预发布环境 230
10.2.7 部署生产环境 230
10.3 构建可复用的流水线步骤 233
10.4 降低部署影响以及实现功能发布的技术 235
10.4.1 暗发布 235
10.4.2 功能标记 236
10.5 小结 237
第四部分 可观测性和所有权
第11章 构建监控系统 241
11.1 稳固的监控技术栈 241
11.1.1 良好的分层监控 243
11.1.2 黄金标志 244
11.1.3 度量指标的类型 244
11.1.4 实践建议 245
11.2 利用Prometheus和Grafana监控SimpleBank 246
11.2.1 配置度量指标收集基础设施 247
11.2.2 收集基础设施度量指标——RabbitMQ 253
11.2.3 监控下单功能 255
11.2.4 告警设置 257
11.3 生成合理的可执行的告警 261
11.3.1 系统出错时哪些人需要知悉 261
11.3.2 症状,而非原因 262
11.4 监测整个应用 262
11.5 小结 264
第12章 使用日志和链路追踪了解系统行为 265
12.1 了解服务间的行为 265
12.2 生成一致的、结构化的、人类可读的日志 268
12.2.1 日志中的有用信息 268
12.2.2 结构化和可读性 269
12.3 为SimpleBank配置日志基础设施 271
12.3.1 基于ELK和Fluentd的解决方案 272
12.3.2 配置日志解决方案 274
12.3.3 配置应收集哪些日志 276
12.3.4 大海捞针 279
12.3.5 记录合适的信息 281
12.4 服务间的跟踪交互 281
12.4.1 请求关联:trace和span 282
12.4.2 在服务内配置链路追踪 283
12.5 链路追踪可视化 287
12.6 小结 291
第13章 微服务团队建设 292
13.1 建设高效团队 292
13.1.1 康威定律 294
13.1.2 高效团队原则 294
13.2 团队模型 296
13.2.1 按职能分组 296
13.2.2 跨职能分组 298
13.2.3 设置团队边界 299
13.2.4 基础设施、平台和产品 300
13.2.5 谁负责值班 302
13.2.6 知识共享 303
13.3 微服务团队的实践建议 304
13.3.1 微服务变更的驱动力 305
13.3.2 架构的角色 305
13.3.3 同质性与技术灵活性 307
13.3.4 开源模型 307
13.3.5 设计评审 308
13.3.6 动态文档 309
13.3.7 回答应用的问题 310
13.4 延伸阅读 311
13.5 小结 311
附录A 在Minikube上安装Jenkins 312
· · · · · · (
收起)