Dubbo服务发现源码解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Dubbo工程是一个Maven多Module的项目,以包结构来组织各个模块。

一、源码模块
1.1 源码模块组织
Dubbo工程是一个Maven多Module的项目,以包结构来组织各个模块。
161698593

核心模块及其关系,如图所示:

152472411

1.2 模块说明
dubbo-common 公共逻辑模块,包括Util类和通用模型。
dubbo-remoting 远程通讯模块,相当于Dubbo协议的实现,如果RPC用RMI协议则不需要使用此包。
dubbo-rpc 远程调用模块,抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。
dubbo-cluster 集群模块,将多个服务提供方伪装为一个提供方,包括:负载均衡、容错、路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发。
dubbo-registry 注册中心模块,基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。
dubbo-monitor 监控模块,统计服务调用次数,调用时间的,调用链跟踪的服务。
dubbo-config 配置模块,是Dubbo对外的API,用户通过Config使用Dubbo,隐藏Dubbo所有细节。
dubbo-container 容器模块,是一个Standalone的容器,以简单的Main类加载Spring启动,因为服务通常不需要Tomcat/JBoss等Web容器的特性,没必要用Web容器去加载服务。因为服务通常不需要 Tomcat/JBoss 等 Web 容器的特性,没必要用 Web 容器去加载服务。

二、服务发现
Dubbo的应用会在启动时完成服务注册或订阅(不论是生产者,还是消费者)如下图所示。

152731660

图中小方块Protocol, Cluster, Proxy, Service, Container, Registry, Monitor代表层或模块,蓝色的表示与业务有交互,绿色的表示只对Dubbo内部交互。
图中背景方块Consumer, Provider, Registry, Monitor代表部署逻辑拓普节点。
图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。
图中只包含RPC的层,不包含Remoting的层,Remoting整体都隐含在Protocol中。

2.1 多种启动方式
除了XML方式,Dubbo的服务Config还支持多种方式,包括

注解驱动(Annotation-Driven)
外部化配置(External Configuration)
以及自动装配(Auto-Configure)
具体的可以参考 http://dubbo.apache.org/zh-cn/blog/dubbo-annotation.html

下面我们的分析以最基础也是应用最广泛的Spring配置方式为例。

2.2 配置信息
在配置文件中,所有dubbo的标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。

相关信息可以参考: Dubbo中对Spring配置标签扩展(http://www.cnblogs.com/ghj1976/p/5379332.html

以 dubbo-demo-provider 为例, 它的配置文件如下:

162391811

com.alibaba.dubbo.demo.provider.DemoServiceImpl 是服务实现类。
com.alibaba.dubbo.demo.DemoService 是服务需要实现的接口。
2.3 配置文件的解析过程
基于dubbo.jar内的META-INF/spring.handlers配置,Spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler。
所有dubbo的标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。
每个service方法的配置会解析成对应的 com.alibaba.dubbo.config.spring.ServiceBean 类的实例。

2.4 服务注册和引用
在Bean对象实例化的过程中,参考Spring Bean对象的生命周期,依次实现了不同的方法完成注册和引用。

关于Spring对象的生命周期,可以参考 https://www.cnblogs.com/zrtqsk/p/3735273.html

在 afterPropertiesSet 后, 会调用到 ServiceConfig.export() ,具体的调用栈如下

162401116

目录
相关文章
|
10天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
26 0
|
10天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
24 0
|
10天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
20 0
|
10天前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
23 0
|
8天前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
29 5
|
9天前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
9天前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
10天前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
20 0
|
10天前
|
Java 容器
Collection-LinkedList源码解析
Collection-LinkedList源码解析
9 0
|
10天前
|
存储 Java 编译器
Collection-ArrayList源码解析
Collection-ArrayList源码解析
12 0

推荐镜像

更多