第1章 应用架构演进 1
1.1 传统垂直应用架构 2
1.1.1 垂直应用架构介绍 2
1.1.2 垂直应用架构面临的挑战 4
1.2 RPC架构 6
1.2.1 RPC框架原理 6
1.2.2 最简单的RPC框架实现 8
1.2.3 业界主流RPC框架 14
1.2.4 RPC框架面临的挑战 17
1.3 SOA服务化架构 18
1.3.1 面向服务设计的原则 18
1.3.2 服务治理 19
1.4 微服务架构 21
1.4.1 什么是微服务 21
1.4.2 微服务架构对比SOA 22
1.5 总结 23
第2章 分布式服务框架入门 25
2.1 分布式服务框架诞生背景 26
2.1.1 应用从集中式走向分布式 26
2.1.2 亟需服务治理 28
2.2 业界分布式服务框架介绍 29
2.2.1 阿里Dubbo 30
2.2.2 淘宝HSF 33
2.2.3 亚马逊Coral Service 35
2.3 分布式服务框架设计 36
2.3.1 架构原理 36
2.3.2 功能特性 37
2.3.3 性能特性 39
2.3.4 可靠性 39
2.3.5 服务治理 40
2.4 总结 41
第3章 通信框架 42
3.1 关键技术点分析 43
3.1.1 长连接还是短连接 43
3.1.2 BIO还是NIO 43
3.1.3 自研还是选择开源NIO框架 46
3.2 功能设计 47
3.2.1 服务端设计 48
3.2.2 客户端设计 50
3.3 可靠性设计 53
3.3.1 链路有效性检测 54
3.3.2 断连重连机制 56
3.3.3 消息缓存重发 57
3.3.4 资源优雅释放 58
3.4 性能设计 59
3.4.1 性能差的三宗罪 59
3.4.2 通信性能三原则 60
3.4.3 高性能之道 61
3.5 最佳实践 61
3.6 总结 64
第4章 序列化与反序列化 65
4.1 几个关键概念澄清 66
4.1.1 序列化与通信框架的关系 66
4.1.2 序列化与通信协议的关系 66
4.1.3 是否需要支持多种序列化方式 67
4.2 功能设计 67
4.2.1 功能丰富度 67
4.2.2 跨语言支持 68
4.2.3 兼容性 69
4.2.4 性能 70
4.3 扩展性设计 71
4.3.1 内置的序列化/反序列化功能类 71
4.3.2 反序列化扩展 72
4.3.3 序列化扩展 75
4.4 最佳实践 77
4.4.1 接口的前向兼容性规范 77
4.4.2 高并发下的稳定性 78
4.5 总结 78
第5章 协议栈 79
5.1 关键技术点分析 80
5.1.1 是否必须支持多协议 80
5.1.2 公有协议还是私有协议 80
5.1.3 集成开源还是自研 81
5.2 功能设计 82
5.2.1 功能描述 82
5.2.2 通信模型 82
5.2.3 协议消息定义 84
5.2.4 协议栈消息序列化支持的字段类型 85
5.2.5 协议消息的序列化和反序列化 86
5.2.6 链路创建 89
5.2.7 链路关闭 90
5.3 可靠性设计 90
5.3.1 客户端连接超时 90
5.3.2 客户端重连机制 91
5.3.3 客户端重复握手保护 91
5.3.4 消息缓存重发 92
5.3.5 心跳机制 92
5.4 安全性设计 92
5.5 最佳实践——协议的前向兼容性 94
5.6 总结 95
第6章 服务路由 96
6.1 透明化路由 97
6.1.1 基于服务注册中心的订阅发布 97
6.1.2 消费者缓存服务提供者地址 98
6.2 负载均衡 98
6.2.1 随机 98
6.2.2 轮循 99
6.2.3 服务调用时延 99
6.2.4 一致性哈希 100
6.2.5 粘滞连接 101
6.3 本地路由优先策略 102
6.3.1 injvm模式 102
6.3.2 innative模式 102
6.4 路由规则 103
6.4.1 条件路由规则 103
6.4.2 脚本路由规则 104
6.5 路由策略定制 105
6.6 配置化路由 106
6.7 最佳实践——多机房路由 107
6.8 总结 108
第7章 集群容错 109
7.1 集群容错场景 110
7.1.1 通信链路故障 110
7.1.2 服务端超时 111
7.1.3 服务端调用失败 111
7.2 容错策略 112
7.2.1 失败自动切换(Failover) 112
7.2.2 失败通知(Failback) 113
7.2.3 失败缓存(Failcache) 113
7.2.4 快速失败(Failfast) 114
7.2.5 容错策略扩展 114
7.3 总结 115
第8章 服务调用 116
8.1 几个误区 117
8.1.1 NIO就是异步服务 117
8.1.2 服务调用天生就是同步的 118
8.1.3 异步服务调用性能更高 120
8.2 服务调用方式 120
8.2.1 同步服务调用 120
8.2.2 异步服务调用 121
8.2.3 并行服务调用 125
8.2.4 泛化调用 129
8.3 最佳实践 130
8.4 总结 131
第9章 服务注册中心 132
9.1 几个概念 133
9.1.1 服务提供者 133
9.1.2 服务消费者 133
9.1.3 服务注册中心 133
9.2 关键功能特性设计 134
9.2.1 支持对等集群 135
9.2.2 提供CRUD接口 136
9.2.3 安全加固 136
9.2.4 订阅发布机制 137
9.2.5 可靠性 138
9.3 基于ZooKeeper的服务注册中心设计 139
9.3.1 服务订阅发布流程设计 139
9.3.2 服务健康状态检测 141
9.3.3 对等集群防止单点故障 142
9.3.4 变更通知机制 144
9.4 总结 144
第10章 服务发布和引用 145
10.1 服务发布设计 146
10.1.1 服务发布的几种方式 146
10.1.2 本地实现类封装成代理 148
10.1.3 服务发布成指定协议 148
10.1.4 服务提供者信息注册 149
10.2 服务引用设计 150
10.2.1 本地接口调用转换成远程服务调用 150
10.2.2 服务地址本地缓存 151
10.2.3 远程服务调用 151
10.3 最佳实践 152
10.3.1 对等设计原则 152
10.3.2 启动顺序问题 153
10.3.3 同步还是异步发布服务 153
10.3.4 警惕网络风暴 154
10.3.5 配置扩展 154
10.4 总结 156
第11章 服务灰度发布 157
11.1 服务灰度发布流程设计 158
11.1.1 灰度环境准备 158
11.1.2 灰度规则设置 159
11.1.3 灰度规则下发 160
11.1.4 灰度路由 161
11.1.5 失败回滚 162
11.1.6 灰度发布总结 163
11.2 总结 163
第12章 参数传递 164
12.1 内部传参 165
12.1.1 业务内部参数传递 165
12.1.2 服务框架内部参数传递 168
12.2 外部传参 169
12.2.1 通信协议支持 169
12.2.2 传参接口定义 170
12.3 最佳实践 171
12.3.1 防止参数互相覆盖 171
12.3.2 参数生命周期管理 171
12.4 总结 172
第13章 服务多版本 173
13.1 服务多版本管理设计 174
13.1.1 服务版本号管理 174
13.1.2 服务提供者 175
13.1.3 服务消费者 175
13.1.4 基于版本号的服务路由 176
13.1.5 服务热升级 177
13.2 与OSGi的对比 178
13.2.1 模块化开发 179
13.2.2 插件热部署和热升级 184
13.2.3 不使用OSGi的其他理由 185
13.3 总结 185
第14章 流量控制 186
14.1 静态流控 187
14.1.1 传统静态流控设计方案 187
14.1.2 传统方案的缺点 188
14.1.3 动态配额分配制 188
14.1.4 动态配额申请制 190
14.2 动态流控 191
14.2.1 动态流控因子 192
14.2.2 分级流控 192
14.3 并发控制 193
14.3.1 服务端全局控制 193
14.3.2 服务消费者流控 194
14.4 连接控制 195
14.4.1 服务端连接数流控 195
14.4.2 服务消费者连接数流控 195
14.5 并发和连接控制算法 195
14.6 总结 197
第15章 服务降级 198
15.1 屏蔽降级 199
15.1.1 屏蔽降级的流程 199
15.1.2 屏蔽降级的设计实现 200
15.2 容错降级 202
15.2.1 容错降级的工作原理 202
15.2.2 运行时容错降级 204
15.3 业务层降级 205
15.4 总结 205
第16章 服务优先级调度 207
16.1 设置服务优先级 208
16.2 线程调度器方案 209
16.3 Java优先级队列 210
16.4 加权优先级队列 211
16.5 服务迁入迁出 212
16.6 总结 213
第17章 服务治理 214
17.1 服务治理技术的历史变迁 215
17.1.1 SOA Governance 215
17.1.2 分布式服务框架服务治理 217
17.1.3 AWS云端微服务治理 217
17.2 应用服务化后面临的挑战 218
17.2.1 跨团队协作问题 219
17.2.2 服务的上下线管控 220
17.2.3 服务安全 220
17.2.4 服务SLA保障 221
17.2.5 故障快速定界定位 221
17.3 服务治理 222
17.3.1 服务治理架构设计 223
17.3.2 运行态服务治理功能设计 225
17.3.3 线下服务治理 232
17.3.4 安全和权限管理 234
17.4 总结 237
第18章 分布式消息跟踪 239
18.1 业务场景分析 240
18.1.1 故障的快速定界定位 240
18.1.2 调用路径分析 241
18.1.3 调用来源和去向分析 242
18.2 分布式消息跟踪系统设计 242
18.2.1 系统架构 243
18.2.2 埋点日志 244
18.2.3 采样率 247
18.2.4 采集和存储埋点日志 248
18.2.5 计算和展示 249
18.2.6 调用链扩展 251
18.3 总结 251
第19章 可靠性设计 253
19.1 服务状态检测 254
19.1.1 基于服务注册中心状态检测 254
19.1.2 链路有效性状态检测机制 255
19.2 服务健康度检测 256
19.3 服务故障隔离 257
19.3.1 进程级故障隔离 257
19.3.2 VM级故障隔离 259
19.3.3 物理机故障隔离 260
19.3.4 机房故障隔离 261
19.4 其他可靠性特性 262
19.4.1 服务注册中心 262
19.4.2 监控中心 262
19.4.3 服务提供者 262
19.5 总结 263
第20章 微服务架构 264
20.1 微服务架构产生的历史背景 265
20.1.1 研发成本挑战 265
20.1.2 运维成本高 267
20.1.3 新需求上线周期长 268
20.2 微服务架构带来的改变 268
20.2.1 应用解耦 268
20.2.2 分而治之 270
20.2.3 敏捷交付 271
20.3 微服务架构解析 271
20.3.1 微服务划分原则 272
20.3.2 开发微服务 272
20.3.3 基于Docker容器部署微服务 274
20.3.4 治理和运维微服务 277
20.3.5 特点总结 278
20.4 总结 279
第21章 服务化最佳实践 280
21.1 性能和时延问题 281
21.1.1 RPC框架高性能设计 281
21.1.2 业务最佳实践 285
21.2 事务一致性问题 286
21.2.1 分布式事务设计方案 287
21.2.2 分布式事务优化 288
21.3 研发团队协作问题 289
21.3.1 共用服务注册中心 290
21.3.2 直连提供者 290
21.3.3 多团队进度协同 291
21.3.4 服务降级和Mock测试 291
21.3.5 协同调试问题 292
21.3.6 接口前向兼容性 292
21.4 总结 292