最近一直在看dubbo 源码,总是静不下来,漂在表面,做了一些笔记,但是想想,很多东西总是要靠自己写一写,记录一下,才会有不一样的收获和心得,我想逼自己一把,所以关于dubbo 源码解析,不如大家理解为dubbo源码导读和笔记吧。
文章目录
- 1.Dubbo你到底是什么?
- 2.什么是rpc?
- 3.dubbo的版本策略
- 4.dubbo 框架设计
- 4.1 首先来看下dubbo的框架设计
- 4.2dubbo中maven相关的依赖
- 4.4.1dubbo-common:公共逻辑模块
- 4.4.2dubbo-remoting:远程通讯模块
- 4.4.3dubbo-rpc:远程调用模块
- 4.4.4dubbo-cluster:集群模块
- 4.4.5 dubbo-registry:注册中心模块
- 4.4.6 dubbo-monitor:监控模块
- 4.4.7 dubbo-config:配置模块
- 4.4.8 dubbo-container 容器模块
- 4.4.9 dubbo-demo 示例模块
- 4.4.10 dubbo-filter 过滤器模块
- 4.4.10 dubbo-plugs 过滤器模块
- 4.4.11 dubbo-serialization——序列化模块
- 总结:
1.Dubbo你到底是什么?
dubbo 官方文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
dubbo的官方文档可能是我见过写的最好的官方文档了,没有之一,所以官方文档上说:Apache Dubbo是一款高性能、轻量级基于Java的RPC开源框架
2.什么是rpc?
我之前有写过一片介绍RPC的文章https://blog.****.net/CoreyXuu/article/details/106397232 感兴趣可以看看,这里解释下:
RPC英文全名为Remote Procedure Call 也叫远程调用,其实就是一个计算机通讯协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
2.1.那个这里肯定会有人想知道 http 和 Rpc 协议有什么区别?(记住,后面要考的)
我们都知道http 属于应用曾面的,而http是跨越了应用层和传输曾,http本身的三次握手,每发送一次请求,都会又一次建立连接的过程,那么相对的肯定会带来一定的延迟,而http本身的报文很大,而RPC则可以更具需求进行连接,调用结束后就会断掉,也可以是长连接,多个远程过程调用共享同一个链接,所以RPC和效率相比较http的效率高一些,但是相对于开发简单快速的HTTP服务,RPC服务就会显得复杂一些。
3.dubbo的版本策略
这个地方我深有体会,为此我还专门总结了一套文档(工作需求)
量大版本并行发展:
2.5.x是稳定版本
2.6.x是新功能实验版本
2.6 上 实验都稳定以后,会迁移到2.5版本
2.7 上也是实验版本,实验稳定也会迁移到2.5
所以如果你想了解dubbo最新 最牛逼的功能,可以选择2.6 -2.7 版本。
所以接下来我会专门介绍2.7.x版本
4.dubbo 框架设计
关于dubbo 官方文档这里就不再介绍了,彩虹屁以后可以刷一波了
4.1 首先来看下dubbo的框架设计
可以看到dubbo被拆分成很多maven项目,屏幕太小没有截全,接下来我介绍下每个模块的作用,官方文档有一个这样的图,
4.2dubbo中maven相关的依赖
dubbo-bom/pom。利用maven bom统一定义了dubbo的版本好,dubbo-demo中的pom文件中都会引用,dubbo-bom/pom.xml, 例如dubbo-demo
dubbo-dependencies-bom/pom.xml:利用Maven BOM统一定义了dubbo依赖的第三方库的版本号。dubbo-parent会引入该bom:
all/pom.xml:定义了dubbo的打包脚本,使用dubbo库的时候,需要引入改pom文件。
dubbo-parent:是dubbo的父pom,dubbo的maven模块都会引入该pom文件。
模块介绍:
4.4.1dubbo-common:公共逻辑模块
包括 Util 类和通用模型。我的理解是,工具类就是一些公用的地方,通用模型就是贯穿整合项目的统一格式的模型,比如URL和,上述就提到了URL贯穿了整个项目。
4.4.2dubbo-remoting:远程通讯模块
**官网:**相当于dubbo协议的实现,如果 RPC 用 RMI协议则不需要使用此包。
自己理解:提供了各种客户端和服务端的通信功能,例如;grizzly,netty,tomcat,RPC除了rmi的协议都要用到此模块
- dubbo-remoting-api:定义了客户端和服务端的连接
- dubbo-remoting-grizzly;基于grizzly实现的service和client
- dubbo-remoting-http;基于Jetty或Tomcat实现的Client和Server。
- dubbo-remoting-mina;基于Mina实现的Client和Server。
- dubbo-remoting-netty4;基于Netty4实现的Client和Server
- dubbo-remoting-p2p; P2P服务器,注册中心multicast中会用到这个服务器使用
- dubbo-remoting-zookeeper;封装了Zookeeper Client ,和 Zookeeper Server 通信
4.4.3dubbo-rpc:远程调用模块
官网:抽象各种协议,以及动态代理,只包含1对1的调用,不关心集群的管理
个人理解:远程调用,最主要的肯定是协议,dubbo提供了非常多的协议实现,不过官方推荐的还是自己的dubbo协议,还给出了一份性能检测报告
性能报告地址:http://dubbo.apache.org/zh-cn/docs/user/perf-test.html
这个模块依赖与dubbo-remoting模块,抽象了各类的协议。
- dubbo-rpc-api 抽象了动态代理的各种协议,实现了一对一的调用
- 包都是各种协议的实现
4.4.4dubbo-cluster:集群模块
将多个服务提供方伪装为一个提供方,包括,负载均衡,容错,路由等,集群的地址列表可以是静态配置,也可以是注册中心下发,
自己的理解为:这个是一个解决出错情况的采用的策略,这个模块里封装了多个策略的实现方法。并且也支持自己扩展集群容错策略,cluster把多个Invoker伪装成一个Invoker,并且在伪装的过程中加入了容错逻辑,失败了重试下一个!
如下图dubbo-cluster 目录结构
- configurator包:配置包,dubbo的基本设计原理都是采用url作为配置信息的统一格式,所有拓展点都通过传递URL携带配置信息,这个包就是更具统一配置规则生成配置信息
- directory包;Directory代表了多个Invoker,并且它的值会随着注册中心的服务变更推送而变化,这里介绍下Invoker,Invoker是Provider的一个调用Service的抽象,Invoker封装了Provider地址以及Service接口信息。
- loadbalance包;封装了负载均衡的实现,负责利用负载均衡算法,从多个Invoker中选出具体的一个Invoker用于此次的调用,如果调用失败,则需要重新选择。
- merger包:封装了合并返回结果,分组聚合到方法,支持多种数据结构类型。
- router包:封装了路由规则的实现,路由规则决定了一次dubbo服务调用的目标服务器,路由规则分两种:条件路由规则和脚本路由规则,并且支持可拓展。
- support包:封装了各类Invoker和cluster,包括集群容错模式和分组聚合的cluster以及相关的Invoker。
- governance包:spi 扩展服务治理包
- interceptor包:选择一个特定的地址调用程序之前在最外层工作
4.4.5 dubbo-registry:注册中心模块
官方:基于注册中心下发地址的集群方式以及对各种注册中心的抽象。
自己理解为:dubbo注册中心的实现是由Multicast注册中心,zookeeper注册中心,和Redis注册中心,eurrka注册中心,sofa注册中心,具体怎么实现,后面在总结一下,这个模块封装了dubbo所支持的注册中心的实现,
1.dubbo-registry-api:抽象了注册中心的注册发现,实现了一些公用的方法,让子类只关注重要的方法,
2.接下来的就是模块就是注册中心的实现方法的封装,其中dubbo-registry-default就是官方文档里面的Simple注册中心。
4.4.6 dubbo-monitor:监控模块
官方: 统计服务调用次数,调用时间的,调用链跟踪的服务
个人理解:这个模块很清楚,就是对服务的监控
1.dubbo-monitor-api;定义了monitor相关的接口,实现了监控所需要的过滤器
2.dubbo-monitor-default;实现了dubbo相关的监控功能
4.4.7 dubbo-config:配置模块
官网:是dubbo对外的api,通过config使用dubbo模块,隐藏dubbo所有细节
个人理解就是:用户都是使用配置来使用api,dubbo提供了四种配置方式,包括xml,属性配置,api配置,注解配置,配置模块就是实现了这四种配置
- dubbo-config-api 实现了api配置和属性配置的功能
- dubbo-config-spring 实现了xml配置和注解配置
4.4.8 dubbo-container 容器模块
官方;是一个 Standlone 的容器,以简单的 Main 加载 Spring 启动,,因为服务通常不需要 Tomcat/JBoss 等 Web 容器的特性,没必要用 Web 容器去加载服务.(这个是重点,记住,要考的!!)
个人理解:因为后台不需要tomcat/joboss等容器的功能,不需要用这些厚重的容器去加载服务的提供方,既浪费资源,又增加了复杂度,服务容器只是一个简单的main方法,加载一些内置容器,也支持扩展容器
- dubbo-container-api:定义了Container接口,实现了服务加载的Main方法。
- 其他三个分别提供了对应的容器,供Main方法加载
4.4.9 dubbo-demo 示例模块
这个模块示快速启动示例,包含了服务提供和服务调用,注册中心示multicast,调用方式是xml 具体比较简单,可以参见官方文档
http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
4.4.10 dubbo-filter 过滤器模块
这个模块提供了内置的一些过滤器
- dubbo-filter-cache 提供缓存过滤器
- dubbo-filter-validation;提供参数校验过滤器
4.4.10 dubbo-plugs 过滤器模块
提供内置插件
dubbo-qos:提供了在线运维的命令。
dubbo-auth:提供了权限控制
4.4.11 dubbo-serialization——序列化模块
该组件提供了支持各种序列化框架的实现
1.dubbo-serialization-api:定义了Serialization的接口以及数据输入输出的接口。
2.其他的包都是实现了对应的序列化框架的方法。dubbo内置的就是这几类的序列化框架,序列化也支持扩展
总结:
dubbo的主要核型模块就是上面的例子了,接下来我按照上面的模块来进行阅读源码和分析总结
Reference:
http://dubbo.apache.org/zh-cn/docs/user/new-features-in-a-glance.html