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注册流程分析相关推荐

  1. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

      退出Activity注册Android遍历 目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方法通 ...

  2. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

    http://blog.csdn.net/vipzjyno1/article/details/25423543 前言 由于一个同学问到我如何按照一个流程走好之后回到首页,我以前看到过4个解决方案,后来 ...

  3. IMS的注册流程分析

    IMS的基础常识: https://www.cnblogs.com/moon-lights/p/7018789.html http://www.360doc.com/content/15/0624/0 ...

  4. Android AOSP 6.0.1 registerReceiver广播注册流程分析

    广播作为 Android 开发的四大组间之一,当我们发送广播以后,发生了什么?广播接收者最终如何收到了广播. 一.复盘广播的使用 在 Android 开发中使用广播分为三个步骤: 1.新建广播接收者 ...

  5. 基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3941172.html,qq:1269122125. 上两章节简要的 ...

  6. nio的epoll和selector实现流程分析

    一.NETTY底层使用的是NIO的selector和epoll进行实现的,select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个 ...

  7. Android8.1 开关VOLTE流程分析

    前言 最近有需求需要实现插卡默认打开Volte功能,顺带研究了下Volte的流程,在此做个记录 开始 从Settings设置界面入手,网络和互联网-->移动网络-->VoLTE高清通话(电 ...

  8. Dubbo源码分析(六)服务引用的具体流程

    前言 在前面的章节中,我们已经完成Dubbo服务暴露的流程分析.今天我们一起来看Dubbo怎么引用这些服务的. 关于服务引用,Dubbo有两种方式.一种是基于注册中心进行服务引用,一种是服务直连进行引 ...

  9. dubbo服务注册流程

    服务注册流程 RegistryProtocol 在dubbo服务发布流程已经分析了发布服务流程还有服务注册流程 export 在RegistryProtocol#export继续服务注册流程 // 根 ...

最新文章

  1. freertos 创建互斥量_STM32CubeMX+FreeRTOS学习[6] 互斥量(Lu)
  2. python的rsa公钥解密方法
  3. Hibernate事实:有利于双向集vs列表
  4. centos6.5 MySQL 服务器_启用CentOS6.5 64位安装时自带的MySQL数据库服务器
  5. 胃癌2019csco指南_2019 CSCO胃癌诊疗指南精华来了!
  6. CSS浮动(Float)(二)
  7. PDF超过6000页,OMG,学它
  8. htpasswd用法
  9. matlab曲面程序,matlab练习程序(曲面拟合)
  10. http接口测试工具
  11. 他称向导师下跪,仍被强制退学,5年博士白读,双方各执一词,同门师兄也有回应!...
  12. 如何使用视频格式转换器将flv转换成MP4
  13. 海马体记忆训练:让你拥有超常记忆力
  14. mysql right syntax_Mysql 出现the right syntax to use near USING BTREE错误解决办法
  15. Ubuntu 解压 zip、z01、z02等文件方法
  16. NEFU ERP 企业资源计划[1] 详细知识点
  17. 我所认识的BIMRevit
  18. [应用方案]N76E003的开发环境构建及下载测试
  19. threejs-剖切
  20. canvas 涂鸦画板,支持笔写、手写、鼠标绘图

热门文章

  1. dd linux 尾部添加0_linux下的dd命令使用详解
  2. SystemTap使用技巧【四】
  3. awd赛题的flag是什么意思_网上说的“立flag”是什么意思?
  4. 电磁阀联锁开关的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. 自动化运维系统具备的功能
  6. Citra 模拟器未找到Shared_fonts错误解决办法
  7. sina新浪iask 用户密码
  8. mcbbs mysql数据库_[娱乐|RPG]WEpicInventory —— 史诗背包!无限拓展!高度自由!MYSQL支持![1.12.2]...
  9. 细数oracle的异常
  10. 重塑互联网最好的方式:以内容为中心的网络