【读书精华分享】《分布式服务框架原理与实践》李林锋(华为PaaS平台架构师)著

来源:互联网 发布:mac系统ai2018破解码 编辑:程序博客网 时间:2024/05/16 16:12

【分享说明】:

我会花很多时间或浅或深的研读一本书,然后总结一些提炼出来的精华,用简短的语言,让其他人能够用很少的时间大致知道这本书能带给自己的价值,如果适用自己,鼓励买一本正本实体书细读和收藏。

通篇会以原文目录为结构,给出提炼内容,如果不重要或者一看目录就懂的,会保留目录,有不明白的,以原文学习为参照。

所有分享内容,为了区分,会以》开头,可能有多行缩进,或差异化颜色表示。


【书名】:《分布式服务框架原理与实践》李林锋(华为PaaS平台架构师)著

【发行】:2016年

【适用】:分布式0基础人员,希望强化实践的,复杂服务平台构建者,微服务方向,java更宜,不适用于用c++做定制化创造框架组件方向的(我个人在这个方向上,后文简单过了一下),更偏基于各种已有组件,构建大型功能集成平台。

【总结】:

1、书不是很长,章节非常多。前面从宏观上讲了需求目标和大体架构,后文分章节细分和实践讲解。

2、整体架构形态讲解的很细致到位,了解全面。

3、后面太长,有重复和冗余,连续读心累,最好后面章节边实践练习边研讨。

4、读完之后视野有开拓的感觉,值得回味再读一遍。

【章节总结】

1章应用框架演变讲了从MVC、RPC、SOA到微服务框架的演变原因、特性和设计原则,深刻体会一下需求场景,有了框架的宏观认识。

2章分布式服务框架入门通过几个常用的框架的分析,整体的讲了分布式设计的原理和组成组件。

3-9章围绕各主要组件,详细的讲了设计考虑因素和一些具体实践。

10-19章围绕分布式架构的一些特殊场景,详细的讲了设计考虑因素和一些具体实践。

20章细节的讲了微服务框架。

21章总结了分布式设计实践中遇到的一些其他方面的总结。


【正式分享】

1章应用架构演进1
1.1
传统垂直应用架构2

LAMPMVC为典型
1.1.1
垂直应用架构介绍2

》简单说就是单线,上是访问入口,最底层是数据存储

》高负责时,通过上层分流(F5七层负载均衡或SLB)做分流,后面是对等逻辑部署(每个分流完全一致)
1.1.2
垂直应用架构面临的挑战4

1复杂应用维护成本高,效率低:一次编译出错全部重新打包

2团队效率差,公共功能重复开发

3系统可靠性变差,雪崩效应,一个模块故障,其他模块压力暴增

4维护和定制困难,代码量增加导致

5新功能上线周期变长:测试周期长,功能无法独立上线

》进化:一些公共功能抽以出来,提供api访问,跨进程形成rpc调用
1.2RPC
架构6

》远程调用框架
1.2.1RPC
框架原理6

4个核心技术点

1、远程服务需要以某种形式提供服务调用相关信息

2、远程代理对象:将本地调用封闭成远程服务调用

3、通信

4、数据序列化
1.2.2
最简单的RPC框架实现8
1.2.3
业界主流RPC框架14

》介绍4

      1FaceBook开发的ApacheThrift:高效完备,丰富的选择

      2Hadoop子项目Avro-RPC:良好的定制化支持,传输和业务分离

      3caucho提供基于binary-RPCHessian:轻量简单易用

      4google gRPC:高性能通用
1.2.4RPC
框架面临的挑战17

》负载均衡实现路由,随着服务增加,单点压力过大

》需要额外增加一个服务注册中心,客户端通过大量缓存路由来降压

》随着业务增多,服务关系复杂,启动顺序难以理清

》服用调用增大,质量问题突显

》服务上线容易下线难

》进化:单纯的RPC治理能力都不健全,需要通过服务框架+服务治理解决
1.3SOA
服务化架构18

》粗粒度松耦合的以服务为中心的框架
1.3.1
面向服务设计的原则18

1、服务可复用

2、服务共享一个标准契约

3、服务是松耦合的,尽可能不依赖其他

4、服务是底层逻辑的抽象

5、服务是可组合可编排的:多个服务组合成一个新服务

6、服务是自治的,逻辑由服务控制,不依赖其他服务

7、服务是无状态的

8、服务是可被自动发现

1.3.2服务治理19

》至少7条挑战

1、分布式框架下的服务调用性能

2、服务化框架如何支持线性扩展

3、如何实现高效、实时监控

4、大规模分布式下的故障快速定界和定位

5、分布下式海量日志检索、模糊查询

6、服务的流控(业务流、事务)、超时控制、服务升降机(增删设备)

7、服务的划分原则,如何实现最大程度复用

8、更多……

SOA的治理

1、服务定义:对服务进行标识,与使用团队协调确保满足需求,避免重复工作

2、服务生命周期治理:计划(未实现)、测试(不服务或有限服务)、运行(服务阶段)、弃用(标识弃用,只减不加)、废弃(下线,从注删中心移除或标记移除)

3、服务版本治理

4、服务注册中心

5、服务监控

6、运行期质量保证:限流、迁入和迁出、升降机、权重调节、服务超时控制

7、快速故障定界定位手段:1、日志汇总索引2、事件跟踪

8、服务安全:主要指服务权限
1.4
微服务架构21

》通过将功能分散到离散的各个服务中以实现对解决方案的解耦
1.4.1
什么是微服务21

》主要特征

1、原子服务,专注于一件事

2、高密度部署

3、敏捷交付

4、微自治
1.4.2
微服务架构对比SOA22

》两者差异

1、拆分粒度不同:SOA粗,重点是异构服务化

2、服务依赖:微服务解耦,尽可能不依赖

3、服务规模不同:SOA打包为主,微服务部署规模膨胀

4、服务治理:SOA静态治理,微服务动态治理

5、微服务敏捷交付为主,小团队研发
1.5
总结23
2章分布式服务框架入门25

》服务化改造的核心技术就是:分布式服务框架
2.1
分布式服务框架诞生背景26
2.1.1
应用从集中式走向分布式26?

》尽可能拆分

      纵向拆分:按属性不同分类处理

横向拆分:按本质不同分块处理,拆分公共等
2.1.2
亟需服务治理28
2.2
业界分布式服务框架介绍29
2.2.1
阿里Dubbo30

》主要质量属性

1、连通性:组件间长连接和缓存

2、健壮性:很多组件挂掉不影响服务

3、伸缩性:服务中心对等集群、服务提供者无状态

4、扩展性:插件设计+管道设计
2.2.2
淘宝HSF33

》框架总结

1、配置化开发,对业务代码低侵入

2、插件管理系统

3、异步NIO(一种通信框架名称)通信,多种序列化方式

4、灵活的路由能力

5、多协议地

6、多种服务治理策略
2.2.3
亚马逊CoralService35

》特点总结

1、支持多协议

2、轻量级框架,非常容易与已有系统集成

3、配置化开发

4、与亚马逊的其他基础设施集成,实现DevOps
2.3
分布式服务框架设计36
2.3.1
架构原理36

》通常抽象成3

1RPC层:本质是通信层,通信和序列化

2FilterChain层:本质是控制和框架层,负载均衡、统计、通知、重试等

3service层:业务对接层

》功能上看核心:服务治理中心和服务注册中心
2.3.2
功能特性37

》服务订阅和发布

配置化发布和引用服务

服务自动发现机制

服务在线注册和去注册

》服务路由

默认提供随机路由、轮循、权重路由等

粘滞链接:总向同一个提供方发请求,记忆功能

路由定制

》集群容错

Failover:失败重试其他节点,读操作或幂等性写操作

Failback:失败自动恢复,重试等,通常用于消息机制

Failfash:只发起一次调用,失败立即报错

》服务调用:同步、异步、并行

》多协议:私有协议、公有协议

》序列化:二进制、文本

》配置中心:本地静态和配置中心动态
2.3.3
性能特性39

》高性能、低时延、性能线性增长(不随着服务增大、负载增大而明显增长)
2.3.4
可靠性39

》服务注册中心

服务健康状态检测

故障切换

HA:高可用,全部挂掉不影响已存在服务

》清除单点状态

服务无状态:任意一台宕掉不影响服务

服务集群容错:只要集群还有1台就正常

》链接健壮性

心跳检测

断连重连
2.3.5
服务治理40

》服务运行状管控

服务路由:高峰修改路由导流

服务限流

服务迁入迁出:高峰迁出

服务降级:强制减用资源

服务超时控制:保持成功率

》服务监控

性能统计

统计报表

告警

》服务生命周期管理

上线审批

下线通知

服务灰度发布

》故障快速定界定位

分布式日志采集

海量日志在线检索

调用链可视化展示

运行日志故障定位

》服务安全

敏感服务的授权策略

链路安全:针对调用者,客户端
2.4
总结41
3章通信框架42
3.1
关键技术点分析43
3.1.1
长连接还是短连接43

》通常是长连接,节约资源
3.1.2BIO
还是NIO43

BIO:同步阻塞模式 NIO:支持多路复用非阻塞
3.1.3
自研还是选择开源NIO框架46

BIO有不足,开源经历实践,netty
3.2
功能设计47
3.2.1
服务端设计48

》重要设计原则

1、只提供上层api,不绑定具体协议

2、提供的api屏蔽底层通信细节

3、服务端功能不要求全,而是扩展性
3.2.2
客户端设计50
3.3
可靠性设计53
3.3.1
链路有效性检测54

ping-pong:发心跳,立即回,请求-回应型

ping-ping:对等心跳,双向心跳
3.3.2
断连重连机制56
3.3.3
消息缓存重发57
3.3.4
资源优雅释放58
3.4
性能设计59
3.4.1
性能差的三宗罪59

》罪一:网络传输方式问题,同步通信压力增大,通信变差

》罪二:序列化性能差

》罪三:线程模型问题导致开了大量线程
3.4.2
通信性能三原则60

》同步的3
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

IP白名单机制
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.1injvm
模式102

》优先寻找本jvm,用本地调用替换远程调用
6.3.2innative
模式102

》优先寻找本机jvm,用本机调用替换远程调用
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
失败自动切换(Failover112

》失败重新回到路由入口
7.2.2
失败通知(Failback113

》将失败告诉调用者
7.2.3
失败缓存(Failcache113

》失败保存,等下次:周期性的、可预测恢复的、延时不敏感的、通知类的等
7.2.4
快速失败(Failfast114

》高峰时非核心业务,就调用一次
7.2.5
容错策略扩展114
7.3
总结115
8章服务调用116

》简单看一下
8.1
几个误区117
8.1.1NIO
就是异步服务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

map无限追加,需要控制
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.3Java
优先级队列210
16.4
加权优先级队列211
16.5
服务迁入迁出212
16.6
总结213
17章服务治理214

》跳过
17.1
服务治理技术的历史变迁215
17.1.1SOAGovernance215

17.1.2分布式服务框架服务治理217
17.1.3AWS
云端微服务治理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.2VM
级故障隔离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.1RPC
框架高性能设计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


阅读全文
0 0