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方法
这个方法只有三步,
- getPackagesToScan:获取需要扫描包路径的集合
- registerServiceAnnotationBeanPostProcessor:注册服务启动的一些bean (重点)
- registerCommonBeans:注册一些通用的bean
这个方法比较简单,根据@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)]



