栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Dubbo注册流程分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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)]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846692.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号