Dubbo注册流程分析
Dubbo注册流程分析
官网简介
Apache Dubbo 是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力。这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。同时 Dubbo 是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。
Apache Dubbo |ˈdʌbəʊ| 提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
为什么要看源码
在使用某些框架之前,多少要对这个框架有所了解,否则在实际开发中遇到了问题会很棘手,而一手资料就是源码
版本
2.7.8
源码分析
1、Dubbo启动的入口
我个人看源码有个习惯,就是找入口,dubbo的也不例外,它的入口和spring cloud差不多,在我们的启动类上,也就是@DubboComponentScan注解
重点显而易见,就是@Import(DubboComponentScanRegistrar.class),@Import注解对于spring boot使用者来说应该不陌生,这里不再赘述,值得一提的是在早一些的版本里(比如 spring-context-5.1.6.RELEASE.jar),它的注释最后有个@see少写了ImportBeanDefinitionRegistrar,误导了跟多像我似的粗心的人,后面的版本又加了上去,很欣慰,粗心的人不止我一个。。。
进入DubboComponentScanRegistrar,果然发现了它实现了ImportBeanDefinitionRegistrar,所以他在程序启动时,就是执行registerBeanDefinitions方法
2、registerBeanDefinitions
这个方法只有三步,
- getPackagesToScan:获取需要扫描包路径的集合
- registerServiceAnnotationBeanPostProcessor:注册服务启动的一些bean (重点)
- registerCommonBeans:注册一些通用的bean
3、getPackagesToScan
这个方法比较简单,根据@DubboComponentScan里的basePackages和basePackageClasses属性查找
包的路径
4、registerServiceAnnotationBeanPostProcessor
代码很简单,利用rootBeanDefinition创建一个BeanDefinitionBuilder,用来创建BeanDefinition(BeanDefinition是spring的一个非常重要的接口,它是spring 里所有bean的基石,它里面有很多bean的元数据,比如是否是单例、作用域是什么、是否是懒加载等等。),然后将ServiceAnnotationBeanPostProcessor注入到IOC容器中,所以接下来就要看ServiceAnnotationBeanPostProcessor做了什么事
5、 ServiceAnnotationBeanPostProcessor
被标记了@Deprecated,暂时先不管他,进入ServiceClassPostProcessor
从这个类实现的几个接口其实也能猜到一些内容,就是他要注册一些bean,下面的常量serviceAnnotationTypes里包含了三个注解,很熟悉吧?没错!就是要找到被这三个注解标记过的类,然后注册成bean。
因为他实现了BeanDefinitionRegistryPostProcessor接口
所以接下来就要看ServiceClassPostProcessor#postProcessBeanDefinitionRegistry这个方法
调用registerInfrastructureBean方法注册一个DubboBootstrapApplicationListener类,这个类其实是个监听器,后面会通过发布的事件触发onApplicationEvent方法,然后通过resolvePackagesToScan处理一下空格的问题,最后如果包路径不为空,执行registerServiceBeans方法
6、registerServiceBeans
这个方法和之前的比稍微长那么一点点,但是也很简单,首先定义一个DubboClassPathBeanDefinitionScanner扫描器,然后再定义一个BeanNameGenerator,它spring的类,会根据规则生成bean的名字,比如内部类会用“#”隔开,之后用forEach增加过滤条件,再之后扫描对应的包里符合条件的类,最后将他们注册成bean,下面就来看看它是如何注册成bean的
7、registerServiceBean
这段代码看上去很恐怖吧?其实也不难,分为以下几步
1、通过resolveClass方法获取类的定义
2、根据类的信息找出他的注解,注意,是serviceAnnotationTypes这个集合,也就是DubboService、Service、com.alibaba.dubbo.config.annotation.Service这三个注解
3、获取注解里定义的属性
4、获取beanClass对应的接口定义
5、生成声明的服务名字
6、创建一个构建服务的BeanDefinition
7、生成bean的名字,这个名字和上面的annotatedServiceBeanName不同,这个beanName是带有group和version的
8、调用registerBeanDefinition完后注册
8、DubboBootstrapApplicationListener监听处理
对此服务就注册完成,其实不然,在所有bean都处理完成后,Spring Ioc会发布一个事件,DubboBootstrapApplicationListener就会监听到这个事件,从而触发它的onApplicationContextEvent方法,dubboBootstrap.start(),然后继续跟下去就是export方法,他会启动一个网络监听,从而实现服务发布
tionContextEvent方法,dubboBootstrap.start(),然后继续跟下去就是export方法,他会启动一个网络监听,从而实现服务发布
[外链图片转存中…(img-GsBGmT4w-1651239681659)]
Dubbo注册流程分析相关推荐
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
退出Activity注册Android遍历 目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方法通 ...
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
http://blog.csdn.net/vipzjyno1/article/details/25423543 前言 由于一个同学问到我如何按照一个流程走好之后回到首页,我以前看到过4个解决方案,后来 ...
- IMS的注册流程分析
IMS的基础常识: https://www.cnblogs.com/moon-lights/p/7018789.html http://www.360doc.com/content/15/0624/0 ...
- Android AOSP 6.0.1 registerReceiver广播注册流程分析
广播作为 Android 开发的四大组间之一,当我们发送广播以后,发生了什么?广播接收者最终如何收到了广播. 一.复盘广播的使用 在 Android 开发中使用广播分为三个步骤: 1.新建广播接收者 ...
- 基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3941172.html,qq:1269122125. 上两章节简要的 ...
- nio的epoll和selector实现流程分析
一.NETTY底层使用的是NIO的selector和epoll进行实现的,select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个 ...
- Android8.1 开关VOLTE流程分析
前言 最近有需求需要实现插卡默认打开Volte功能,顺带研究了下Volte的流程,在此做个记录 开始 从Settings设置界面入手,网络和互联网-->移动网络-->VoLTE高清通话(电 ...
- Dubbo源码分析(六)服务引用的具体流程
前言 在前面的章节中,我们已经完成Dubbo服务暴露的流程分析.今天我们一起来看Dubbo怎么引用这些服务的. 关于服务引用,Dubbo有两种方式.一种是基于注册中心进行服务引用,一种是服务直连进行引 ...
- dubbo服务注册流程
服务注册流程 RegistryProtocol 在dubbo服务发布流程已经分析了发布服务流程还有服务注册流程 export 在RegistryProtocol#export继续服务注册流程 // 根 ...
最新文章
- freertos 创建互斥量_STM32CubeMX+FreeRTOS学习[6] 互斥量(Lu)
- python的rsa公钥解密方法
- Hibernate事实:有利于双向集vs列表
- centos6.5 MySQL 服务器_启用CentOS6.5 64位安装时自带的MySQL数据库服务器
- 胃癌2019csco指南_2019 CSCO胃癌诊疗指南精华来了!
- CSS浮动(Float)(二)
- PDF超过6000页,OMG,学它
- htpasswd用法
- matlab曲面程序,matlab练习程序(曲面拟合)
- http接口测试工具
- 他称向导师下跪,仍被强制退学,5年博士白读,双方各执一词,同门师兄也有回应!...
- 如何使用视频格式转换器将flv转换成MP4
- 海马体记忆训练:让你拥有超常记忆力
- mysql right syntax_Mysql 出现the right syntax to use near USING BTREE错误解决办法
- Ubuntu 解压 zip、z01、z02等文件方法
- NEFU ERP 企业资源计划[1] 详细知识点
- 我所认识的BIMRevit
- [应用方案]N76E003的开发环境构建及下载测试
- threejs-剖切
- canvas 涂鸦画板,支持笔写、手写、鼠标绘图
热门文章
- dd linux 尾部添加0_linux下的dd命令使用详解
- SystemTap使用技巧【四】
- awd赛题的flag是什么意思_网上说的“立flag”是什么意思?
- 电磁阀联锁开关的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 自动化运维系统具备的功能
- Citra 模拟器未找到Shared_fonts错误解决办法
- sina新浪iask 用户密码
- mcbbs mysql数据库_[娱乐|RPG]WEpicInventory —— 史诗背包!无限拓展!高度自由!MYSQL支持![1.12.2]...
- 细数oracle的异常
- 重塑互联网最好的方式:以内容为中心的网络