【分享说明】:
我会花很多时间或浅或深的研读一本书,然后总结一些提炼出来的精华,用简短的语言,让其他人能够用很少的时间大致知道这本书能带给自己的价值,如果适用自己,鼓励买一本正本实体书细读和收藏。
通篇会以原文目录为结构,给出提炼内容,如果不重要或者一看目录就懂的,会保留目录,有不明白的,以原文学习为参照。
所有分享内容,为了区分,会以》开头,可能有多行缩进,或差异化颜色表示。
【书名】:《分布式服务框架原理与实践》李林锋(华为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
》LAMP和MVC为典型
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在
1、FaceBook开发的ApacheThrift:高效完备,丰富的选择
2、Hadoop子项目Avro-RPC:良好的定制化支持,传输和业务分离
3、caucho提供基于binary-RPC的Hessian:轻量简单易用
4、google 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层
1、RPC层:本质是通信层,通信和序列化
2、FilterChain层:本质是控制和框架层,负载均衡、统计、通知、重试等
3、service层:业务对接层
》功能上看核心:服务治理中心和服务注册中心
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失败自动切换(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.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