每日一博 | Dubbo 底层原理剖析
阅读指南
本文会通过 图文+案例,对 Dubbo 的底层原理进行剖析-探索Dubbo 分层的意义。阅读之前,要求对 Dubbo 有所了解,并且会简单使用。最好阅读下前面的一篇文章: 基于 Java 实现最初级版的 RPC。
正文
先来看一张摘自官网的 令人头大 的 Dubbo 框架设计图,另外还有几张图,就不一一贴出了,详细请参考 [Dubbo 框架设计](http://dubbo.apache.org/zh- cn/docs/dev/design.html)
其实 Dubbo 官网关于框架设计的部分已经讲得很详细了,但是对于我们这种没工作多久的菜鸟,仍然需要花费大量的时间去理解。
框架设计的简要说明
Dubbo 的框架设计图中从下至上分为十层,其中,Service 和 Config 层为 API,其它各层均为 SPI。也就是除了 Service 和 Config 层,其余各层都至少有一种替代品。
比如 Protocol 层:
- org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol
- org.apache.dubbo.rpc.protocol.rmi.RmiProtocol
- org.apache.dubbo.rpc.protocol.http.HttpProtocol
Dubbo 的这种高扩展性全部基于 Dubbo SPI 机制,前面花费了多篇文章去讲解 Dubbo SPI 使用,这是研究 Dubbo 源码的关键。
官网 Demo 案例
篇幅原因,具体使用方法和代码还是到官网 Dubbo - 快速启动,下面的内容全部基于这个案例。
图解服务调用过程
官网给出了非常详细的服务调用过程,都是从架构层面,还有整个流程会经历哪个类,哪个方法,下面就基于官网的图文,再结合案例给出自己的理解。
从 main 函数的代码来看,整个流程看着很简单
当我们加上注册中心后
结合 xml 配置 和 Dubbo - 架构, 图解如下:
结合框架设计
服务引用过程
-
4.1 Proxy 层 对服务消费端使用的
DemoService
接口进行代理,把本地调用透明地转换为远程调用, 该层默认使用的是JavassistProxyFactory
, 对该层的理解,可以参考之前的文章 基于 Java 实现最初级版的 RPC -
4.2 Cluster 层 从图中可以看出,服务提供者有 2 个实例,那么消费者最终会调用哪个实例,就是由 Cluster 层决定的,该层还会桥连注册中心 zookeeper,获取 2 个服务提供者的注册信息,比如ip,port。当然该层还有其他功能。
-
4.3 Protocol 层 要实现图中的远程调用,其实本质就是通过网络通信,来传输信息。Dubbo 为此提供了多种通信协议,默认为 DubboProtocol。
// 有删减 dubbo://LOCALHOST:20880/org.apache.dubbo.demo.DemoService ?anyhost=true&application=demo-provider&bind.ip=192.168.31.87&bind.port=20880& interface=org.apache.dubbo.demo.DemoService &methods=sayHello,sayHello1×tamp=1586693904645
-
4.4 Exchanger 层 封装请求响应内容为 Request / Response 对象。做 web 接口开发的都知道,我们会把一些参数或者响应内容封装到 XXXRequest/YYYResponse 对象中。
-
4.5 Transport 层 该层为网络传输层,基于 Netty ,Mina 等通信框架实现。
-
4.6 Serialize 既然涉及到网络传输,必然会把请求对象进行序列化操作。
服务暴露过程
- 5.1 开启 Server 并监听指定端口
- 5.2 将请求数据进行反序列化
- 5.3 Exchanger 负责解析 Request 对象
- 5.4 通过 Protocol 层, 根据具体协议解析 Request 对象
- 5.5 对服务提供者的服务实现类进行代理
总结
本文结合官网的 Demo 案例, 通过画图的方式, 对 Dubbo 的框架设计图进行了简化, 目的是了解 Dubbo 框架分层的作用。一个简单的 RPC 就是基于动态代理 + 网络通信,
- 动态代理 (Proxy) 就是把本地调用透明转换为远程调用
- 远程调用就要涉及到网络通信 (Transport) - 基于 socket
- 在 socket 基础上, 我们可以自定义我们的协议 (Protocol) ,也可以复用现有的协议,比如 http
- 基于上面的过程, 我们可以封装 Request / Response 对象 (Exchanger)
- 既然要网络传输, 就要想办法进行序列化/反序列化 (Serialize)
- 当提供多个服务提供者实例时, 就应该有一个地方 (注册中心 Register) 负责管理服务提供者的元数据信息,
- 当消费者从上面的多个服务提供者 选取一个 调用服务 (Cluster) 时, 就要选取某种策略 (比如轮询, hash)
- 最后需要一个监控中心 (Monitor) , 负责一些统计功能,比如服务调用次数
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
qBittorrent 4.2.4 发布,BT 下载客户端
qBittorrent 4.2.4现已正式发布。qBittorrent 是一款轻量高速的免费 BT 下载客户端软件,旨在打造成开源版的μTorrent 。它支持所有主要平台(Linux、Mac OS X、Windows、OS/2 与 FreeBSD),并提供相同的功能。 4.2.4版本的更新内容如下: Bugfix 修复了传输列表的子排序 修复了禁用“prevent sleeping”计时器的错误逻辑 设置了较早版本的 libtorrent 的磁盘缓存大小 排序区域语言列表 删除了 mascot 周围的白色轮廓 配置所选网络接口且不泄漏 IP 的各种修复 torrent storage 移动时保存“恢复数据” 避免将编码后的恢复数据保存在内存中 修复“Last seen complete”的日期格式 从高级设置中删除不赞成使用的严格超级播种模式 更改默认的 stop_tracker_timeout 设置 转换日志小部件以使用自定义视图/模型 更改默认的上传插槽限制 更改代理类型时不要取消选中“身份验证”复选框 减少选择 tray icons 的歧义 Webui:修复了无法在 WebUI...
- 下一篇
Rust 语言 2019 调查报告发布:它为什么流行不起来?
从 2019 年下半年至今,不到一年的时间内,Rust 语言确实接二连三地掀起过一些波澜。从微软探索将 Rust 作为 C 和 C++ 的安全替代方案开始,Rust 吸引了越来越多的目光:内核维护者表示愿意接受用 Rust 开发 Linux 驱动;AWS 也伸出橄榄枝,宣布赞助 Rust;微软更进一步,在今年年初开发并开源了受 Rust 启发的新编程语言 Verona;最近,苹果也站出来拥抱它,将 C 代码移植到 Rust。 此外,Rust 连续四年在 StackOverflow 开发者调查中蝉联“最受开发者喜爱的编程语言”。有意思的是,其中 97% 的受访者并未使用过 Rust,他们对Rust 语言的喜爱,仍停留在“想学习”的阶段。 近日,Rust 官方博客发布了 2019 年度的Rust 语言调查报告。其中有些问题也许能够解释为什么Rust 语言如此被关注,却一直没有真正流行起来。 该调查共收到以 14 种不同语言完成的 3,997 份回复,使用英语的受访者人数占比最高,为 69.6%,其次是10.8% 的中文受访者。调查报告中特地指明,非英语受访者希望有自己所使用语言的 Rust...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)