书籍作者:翟陆续 | ISBN:9787121376931 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:8566 |
创建日期:2021-02-14 | 发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
Dubbo是阿里巴巴开发的一个开源的高性能、高可用、可扩展的分布式RPC调用框架,致力于提供高性能和透明化的 RPC 远程调用服务解决方案。作为阿里巴巴 SOA 服务化治理方案的核心框架,目前已进入 Apache 孵化器项目。在单体应用时,不同业务模块部署在同一个JVM 进程内,这时通过本地调用就可以解决不同业务模块之间的相互引用;但在多体应用时,不同业务模块大多部署到不同的机器上,这时一个高效、稳定的RPC框架就显得特别重要了。Apache Dubbo 作为阿里巴巴开源的分布式RPC 框架,在进入Apache 孵化器项目后现已毕业,相信在开源社区的不断贡献下,它会成为RPC 框架中的佼佼者。本书是对Apache Dubbo 的使用以及内核原理的深度剖析,分为三部分:第一部分为基础篇,首先从整体上讲解使用Dubbo 搭建的系统由哪些模块组成,各模块相互之间的调用关系是怎么样的,然后基于本书的Demo 讲解如何使用Dubbo ;第二部分为高级篇,主要讲解Dubbo 框架内部实现原理,包含支撑Dubbo框架的适配器类原理、动态编译原理、增强SPI 原理、消费端的泛化调用实现原理、消费端异步调用与服务提供端的异步执行、Dubbo 框架的线程模型、消费端负载均衡策略、消费端集群容错策略、并发控制原理、Dubbo 网络协议等;第三部分为实践篇,主要探讨如何使用Arthas 和一些Demo 为研究Dubbo 框架原理提供方便,并且讲解如何基于CompletableFuture 和Netty 模拟RPC 同步与纯异步调用。本书将原理与实践相结合,由浅入深、通俗易懂地讲解了Dubbo 框架的使用及内核原理实现,适合Java 中高级研发工程师,以及对RPC 框架技术感兴趣,希望探究RPC 框架内部实现原理的人员阅读。
本书是目前市面上v一一本基于Dubbo2.7版本的zuixin著作。作者认为掌握Apache Dubbo的实现原理,有助于读者深入理解分布式系统中的很多技术点,提高自己在技术方面的核心竞争力。
从这样的初衷出发,针对读者的需求,作者将全书分为三大部分:第一部分用实例讲解Dubbo的使用,即从整体上讲解用Dubbo搭建系统包括哪些模块,相互之间的关系;第二部分分析Dubbo的内部实现原理,包括支撑Dubbo框架的适配器类原理、动态编译原理、增强SPI 原理、消费端的泛化调用实现原理、消费端异步调用与服务提供端的异步执行、Dubbo 框架的线程模型、消费端负载均衡策略、消费端集群容错策略、并发控制原理、Dubbo 网络协议等;第三部分为实践篇,主要探讨如何使用Arthas 和一些Demo 来为研究Dubbo 框架原理提供方便,并且讲解如何基于CompletableFuture 和Netty 模拟RPC 同步与纯异步调用。
推荐序
源项目怎样才算成功呢?在我看来,生产环境中实践的越多,参与贡献的人越多,愿意学习掌握的人越多,就越成功。而帮助更多的人了解Dubbo,掌握Dubbo,学习资料的丰富程度就成为了关键。这不是靠Dubbo开源团队的几篇博文、实例代码和官方文档能够撑得起来的。我非常期望看到有更多的Dubbo 出版物出现。
幸运的是,在这两年中,我的确看到了越来越多的科技博主在介绍Dubbo,有人开始在知识付费频道讲授Dubbo 的课程,我本人也有幸被几本书的作者邀请写推荐或者序。今天,又有幸被我在阿里巴巴的同事翟陆续邀请,为本书作序。翟陆续,花名加多,担任并发编程网编辑,同时是另一本书《Java 并发编程之美》的作者。他带来的这本书是基于Dubbo 目前的主干版本2.7。作者深入浅出地从基本用法讲起,然后逐一剖析了Dubbo 的架构、扩展、服务的注册与发现、路由、集群、线程、协议与网络等方方面面,基本上涵盖了Dubbo 这个服务框架最主要的部分。对于想深入到Dubbo 源码的读者有着相当大的帮助。最后,作者介绍了如何使用Arthas 来帮助理解Dubbo 的工作,如何利用Dubbo 的SPI 扩展机制来实现自定义的负载均衡策略。作者在一本书中介绍了两个来自我的团队的开源作品,也让我有点受宠若惊。
最后,也通过写序的机会,感谢本书的作者加多。本书是目前市面上能够看到的唯一一本基于2.7 版本介绍Dubbo 原理的书籍。作者将关键源码与图文有机结合,深入浅出地介绍了Dubbo 的关键实现。也期待更多的开源爱好者通过学习本书,加入Dubbo 开源的大家庭,把国人主导的这个Apache 顶级项目做得越来越好!
——阿里巴巴高级技术专家Apache Dubbo PMC Chair, 罗毅(北纬)
前言
在单体应用时,不同业务模块部署在同一个JVM 进程内,这时通过本地调用就可以解决不同业务模块之间的相互引用;但在多体应用时,不同业务模块大多部署到不同的机器上,这时一个高效、稳定的RPC 框架就显得特别重要了。Apache Dubbo 作为阿里巴巴开源的分布式RPC 框架,是众多RPC 框架中比较优秀的一个,在进入Apache 孵化器项目后现已毕业,相信在开源社区的不断贡献下,它会成为RPC 框架中的佼佼者。
为何要研究Apache Dubbo 的实现原理
引用笔者在《Java 并发编程之美》一书前言中的论述:研究开源框架,特别是优秀的开源框架的实现原理,可以开拓我们的技术视野,提高我们的架构能力,减少由于使用不当导致的线上故障的发生。而在微服务大行其道的今天,RPC 框架作为微服务之间通信的一种手段,其在微服务架构中占有一席之地,Apache Dubbo(后面简称Dubbo)则是RPC框架中比较优秀的代表,为了更好地使用它,其实现原理自然值得我们去探究。
下面我们具体谈谈通过研究Dubbo 框架的实现原理,到底能学到什么。
我们首先可以学习和深刻体会到分层架构带来的好处。Dubbo 框架从整体上分为了业务(Business)层、RPC 层和远程调用(Remoting)层,其中业务层提供API,让使用者方便地发布与引用服务;RPC 层则是对服务注册与发现、服务代理、路由、负载均衡等功能的封装,该层又可以被划分为很多层;远程调用层则是对网络传输与请求数据序列/反序列化等的抽象。使用分层架构可以保证下层的改变对上层不可见,并且可以实现关注点分离,比如使用者使用Dubbo 时只关心如何使用业务层的API 来发布与引用服务,而不需要关心RPC 层的实现,当新版本Dubbo 升级了RPC 层的逻辑时,使用者只需要升级Dubbo 的版本就可以了,这是因为RPC 层的修改对业务层使用者来说是透明的。
我们也可以学习到好的框架应该具有可扩展性。Dubbo 就是一个扩展性极强的框架,其RPC 层中的所有组件都是基于SPI 扩展接口实现的,每个组件都可以被替换;Dubbo增强了 JDK 中提供的标准 SPI 功能,并且增加了对扩展接口的IoC (一个扩展接口可以直接使用setter() 方法注入其他扩展接口)和 AOP 的支持(可以使用Wrapper 类对扩展接口进行功能增强);增强SPI 不会一次性实例化扩展点的所有实现类,从而避免了当扩展点实现类初始化很耗时但当前还没用上它的功能时,仍进行加载实例化这种浪费资源的情况;增强的 SPI 是在具体用到某个实现类时才对具体实现类进行实例化。
作为高可用分布式RPC 框架,其自身必须具有容错能力,以便提高系统的可用性。Dubbo 框架则提供了分布式系统中常见的集群容错策略,并且提供了扩展接口,让使用方方便地定制自己的集群容错策略,通过研究Dubbo 框架提供的集群容错策略,可以让我们对分布式系统中的容错技术有深入的理解。在分布式系统中,每个微服务都是以集群的方式部署的,那么当我们访问一个具体服务时到底访问哪一台机器提供的服务呢?这就是分布式系统中负载均衡器与路由规则要做的事情,作为分布式RPC 框架,其自身也必须具有负载均衡的能力。Dubbo 框架提供了分
布式系统中常见的负载均衡策略,并且提供了扩展接口,让使用者方便地定制自己的负载均衡策略;另外,路由规则提供了服务治理的一种策略,在Dubbo 中我们可以通过管理控制台来配置路由规则,让消费者只可访问那些服务提供者。通过研究Dubbo 框架提供的负载均衡与路由策略,可以让我们对分布式系统中的负载均衡技术与路由规则有深入的理解。
在分布式系统中,当我们要消费某个服务时,如何找到其地址是一个要解决的问题。在分布式RPC 中,一个通用解决方案是引入服务注册中心,当服务提供者启动时,会自动把自己的服务注册到服务注册中心;当消费者启动时,会去服务注册中心订阅自己感兴趣的服务的地址列表。在Dubbo 框架中,提供了扩展接口来方便地让我们使用ZooKeeper、Redis 等作为服务注册中心,通过研究Dubbo 原理,我们可以深刻理解服务提供方到底是如何把服务注册到服务注册中心的,以及服务消费端是如何动态地感知服务提供方地址列表变化的。所有RPC 框架要解决的一个问题是,如何让使用者无感知地发起远程过程调用,也就是让使用者在发起远程调用时有和本地调用一样的体验。Dubbo 框架和其他RPC 框架一样,采用代理来实现该功能。在Dubbo 框架中扩展接口Proxy 就是专门来做代理使用
的,并且其提供了扩展接口的JDK 动态代理与Cglib 的实现。研究Dubbo 的原理,我们可以学习到消费端如何对服务接口进行代理以实现透明调用,服务提供端如何使用代理与JavaAssist 技术来减少反射调用开销。
在Dubbo 的分层架构中,Transport 网络传输层把Mina 和 Netty 抽象为统一接口 ,并且在默认情况下使用Netty 作为底层网络通信。通过研究Dubbo,我们可以学习到Dubbo的网络协议帧是如何设计的;服务消费端是如何启动Netty 客户端的,是如何把RPC 请求封装为协议帧并序列化然后通过Netty 客户端发起网络请求的;服务提供端又是如何启动Netty 服务器进行服务监听的,是如何处理经典的半包、粘包问题的,是如何把接收到的二进制包转换为Dubbo 协议帧并反序列化为POJO 对象的。另外,使用Netty 时都说不要在ChannelHandler 中做阻塞的事情,以免阻塞了I/O 线程,使其他请求得不到及时处理,那么这到底是什么意思呢?研究完Dubbo 的线程模型后,你就会明白了。
对于网络请求来说,同步调用是比较直截了当的,但是同步调用意味着当前发起请求的调用线程在远端机器返回结果前必须阻塞等待,这显然很浪费资源。好的做法是发起请求的调用线程发起请求后,注册一个回调函数,然后马上返回去做其他事情,当远端把结果返回后再使用I/O 线程执行回调函数,也就是发起方实现了异步调用,调用线程不会被阻塞。Dubbo 则基于Netty 的异步非阻塞能力和JDK 8 中的CompletableFuture 轻松地实现RPC 请求的异步调用,提高了资源利用率。通过研究Dubbo 的实现原理,我们可以对异步编程带来的好处以及实现原理有深刻的体会。
……
总之,研究透彻Dubbo 框架原理实现后,你会对分布式系统中的很多技术点有深入的理解。而笔者坚信分布式系统是应用的发展方向,因为随着业务规模的增大,为了保障系统的可伸缩性、高可用性,系统必然朝着分布式方向发展。所以,掌握一些分布式系统中的优秀RPC框架的原理及实现细节,无论现在还是将来都将成为区别于他人的核心竞争力。
如何阅读本书
本书分为三部分:第一部分为基础篇,首先从整体上讲解使用Dubbo 搭建的系统由哪些模块组成,各模块相互之间的调用关系是怎么样的,然后基于本书的Demo 讲解如何使用Dubbo ;第二部分为高级篇,主要讲解Dubbo 框架内部的实现原理,包含支撑Dubbo框架的适配器类原理、动态编译原理、增强SPI 原理、消费端的泛化调用实现原理、消费端异步调用与服务提供端的异步执行、Dubbo 框架的线程模型、消费端负载均衡策略、消费端集群容错策略、并发控制原理、Dubbo 网络协议等;第三部分为实践篇,主要探讨如何使用Arthas 和一些Demo 来为研究Dubbo 框架原理提供方便,并且讲解如何基于CompletableFuture 和Netty 模拟RPC 同步与纯异步调用。
读者可以在博文视点官方网站(http://www.broadview.com.cn)下载本书的Demo 源码。
基 础 篇
第1 章 Dubbo 基础 / 2
1.1 初识Dubbo / 2
1.2 本书Demo 详解 / 3
1.2.1 Demo 结构说明 / 3
1.2.2 SDK 模块 / 4
1.2.3 同步发布与调用服务 / 6
1.2.4 服务消费端异步调用服务/ 10
1.2.5 服务提供端异步执行 / 13
1.2.6 服务消费端泛化调用 / 17
1.2.7 服务消费端本地服务mock 与服务降级 / 21
1.2.8 隐式参数传递 / 24
1.2.9 本地服务暴露与引用 / 26
1.3 小结 / 28
高 级 篇
第2章 Dubbo 框架内核原理剖析 / 30
2.1 Dubbo 分层架构概述 / 30
2.2 Dubbo 远程调用细节 / 33
2.2.1 服务提供者暴露一个服务的概要过程 / 33
2.2.2 服务消费者消费一个服务的概要过程 / 34
2.3 Dubbo 的适配器原理 / 35
2.4 Dubbo 的动态编译原理 / 36
2.5 Dubbo 增强SPI / 39
2.5.1 JDK 标准SPI 原理 / 39
2.5.2 增强SPI 原理 / 43
2.5.3 扩展点的自动包装 / 54
2.6 Dubbo 使用JavaAssist 减少反射调用开销 / 57
2.7 小结 / 60
第3章 远程服务发布与引用流程剖析 / 61
3.1 Dubbo 服务发布端启动流程剖析 / 61
3.2 Dubbo 服务提供方如何处理请求 / 74
3.3 Dubbo 服务消费方启动流程剖析 / 81
3.4 Dubbo 服务消费端一次远程调用过程 / 97
3.5 小结 / 100
第4章 Directory 目录与Router 路由服务 / 101
4.1 Directory 目录 . / 101
4.2 RegistryDirectory 的创建 / 101
4.3 RegistryDirectory 中invoker 列表的更新 102
4.4 小结 / 107
第5章 Dubbo 消费端服务mock 与服务降级策略原理 / 108
5.1 服务降级原理 / 108
5.1.1 降级策略注册 / 108
5.1.2 服务消费端使用降级策略 / 109
5.2 本地服务mock 原理 / 111
5.2.1 mock 合法性检查 / 111
5.2.2 服务消费端使用mock 服务 / 113
5.3 小结 / 116
第6章 Dubbo 集群容错与负载均衡策略 / 117
6.1 Dubbo 集群容错策略概述 / 117
6.2 Failfast Cluster 策略源码分析 / 119
X ┃ 深度剖析Apache Dubbo核心技术内幕
6.3 Failsafe Cluster 策略源码分析 / 120
6.4 Failover Cluster 策略源码分析 / 120
6.5 Failback Cluster 策略源码分析 / 122
6.6 Forking Cluster 策略源码分析 / 124
6.7 Broadcast Cluster 策略源码分析 / 127
6.8 如何基于扩展接口自定义集群容错策略 / 128
6.9 Dubbo 负载均衡策略概述 / 129
6.10 Random LoadBalance 策略源码分析 / 131
6.11 RoundRobin LoadBalance 策略源码分析 / 134
6.12 LeastActive LoadBalance 策略源码分析 / 139
6.13 ConsistentHash LoadBalance 策略源码分析 / 141
6.13.1 一致性 Hash 负载均衡策略原理 / 141
6.13.2 源码分析 / 147
6.14 如何基于扩展接口自定义负载均衡策略/ 148
6.15 小结 / 149
第7章 Dubbo 线程模型与线程池策略 / 150
7.1 Dubbo 的线程模型概述 / 150
7.2 AllDispatcher 源码剖析 / 152
7.3 DirectDispatcher 源码剖析 / 154
7.4 MessageOnlyDispatcher 源码剖析 / 154
7.5 ExecutionDispatcher 源码剖析 / 155
7.6 ConnectionOrderedDispatcher 源码剖析/ 156
7.7 线程模型的确定时机 / 159
7.8 如何基于扩展接口自定义线程模型 / 160
7.9 Dubbo 的线程池策略 / 161
7.10 FixedThreadPool 源码剖析 / 161
7.11 LimitedThreadPool 源码剖析 / 163
7.12 EagerThreadPool 源码剖析 / 164
7.13 CachedThreadPool 源码剖析 / 166
7.14 线程池的确定时机 / 168
7.15 如何基于扩展接口自定义线程池策略 / 168
7.16 小结 / 169
第8章 Dubbo 如何实现泛化引用 / 170
8.1 服务消费端GenericImplFilter 源码分析 / 170
8.2 服务提供端GenericFilter 源码分析 / 172
8.3 小结 / 176
第9章 Dubbo 并发控制 / 177
9.1 服务消费端并发控制 / 177
9.2 服务提供端并发控制 / 182
9.3 小结 / 185
第10章 Dubbo 隐式参数传递 / 186
10.1 服务消费端AbstractClusterInvoker 原理剖析 / 186
10.2 服务提供方ContextFilter 原理剖析 / 188
10.3 小结 / 189
第11章 Dubbo 全链路异步 / 190
11.1 服务消费端异步调用 / 190
11.1.1 2.7.0 版本前的异步调用实现 / 191
11.1.2 2.7.0 版本提供的异步调用实现 / 201
11.2 服务提供端异步执行/ 204
11.2.1 基于定义CompletableFuture 签名的接口实现异步执行 / 205
11.2.2 使用AsyncContext 实现异步执行 / 208
11.3 异步调用与执行引入的新问题 / 211
11.3.1 Filter 链 / 211
11.3.2 上下文对象传递 / 216
11.4 小结 / 218
第12章 本地服务暴露与引用原理 / 219
12.1 本地服务暴露流程 / 219
12.2 本地服务引用启动流程 / 222
XII ┃ 深度剖析Apache Dubbo核心技术内幕
12.3 本地服务一次引用流程 / 224
12.4 小结 / 225
第13章 Dubbo 协议与网络传输 / 226
13.1 Dubbo 协议 / 226
13.2 服务消费方编码原理 / 229
13.3 服务发布方解码原理 / 233
13.4 小结 / 241
实 践 篇
第14章 Dubbo 实践 / 244
14.1 Arthas 的简介与安装 / 244
14.2 查看扩展接口适配器类的源码 / 245
14.3 查看服务提供端Wrapper 类的源码 / 247
14.4 查询Dubbo 启动后都有哪些Filter / 250
14.5 Demo 验证RoundRobin LoadBalance 负载均衡原理 / 253
14.6 如何动态获取Dubbo 服务提供方地址列表/ 256
14.6.1 场景概述/ 256
14.6.2 原理与实现 / 257
14.7 根据IP 动态路由调用Dubbo 服务/ 260
14.8 基于CompletableFuture 和Netty 模拟RPC 同步与纯异步调用 / 264
14.8.1 协议帧定义 /..265
14.8.2 RpcServer 的实现 / 265
14.8.3 RpcClient 的实现 / 268
14.8.4 实例 / 273
14.9 小结 / 275