Dubbo 核心源码解读

在微服务盛行的当下,Dubbo提供高效服务间调用方案。本文介绍Dubbo定义,版本为2.7.3。从将引用类放入Ioc容器及bean实例化、服务间调用两方面展开,阐述了Dubbo与Spring的整合、注解的Bean注册,还说明了服务间调用入口及流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          前言:在当下微服务盛行的局势下,服务之间的通行异常频繁,而Dubbo也就应运而生,提供一套高效的服务间调用方案。Dubbo整合了Netty通过TCP/IP网络协议实现服务间调用,更高效快捷。从两个方面来了解:Provider @Service、Consumer @Reference代理类的产生、一次服务间的调用流程

       Dubbo如何定义:Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。     

      Dubbo框架依赖关系图:Dubbo Dependence relationship

 

    本文Dubbo版本:2.7.3

1、我们需要了解dubbo是如何将代引用类放入到Ioc容器以及bean的实例化。我们在使用Dubbo的 @Service @Reference 注解来修饰Bean并注入到其他类中,类的产生类似jdk的代理,通过代理将bean实例化。

    1.1、ReferenceAnnotationBeanPostProcessor ServiceAnnotationBeanPostProcessor与spring的整合:@EnableDubbo做了什么事情,spring在扫描EnableDubbo是,spring会在初始化Ioc容器是会注入@import引用的类,这里就引用了 DubboComponentScanRegistrar 、DubboConfigConfigurationRegistrar,这两个类实现了ImportBeanDefinitionRegistrar,spring 会回掉这里面的registerBeanDefinition()方法,再往下看,就很明白了,dubbo通过这种机制注入class信息封装成BeanDefinition到Ioc容器。

public class DubboComponentScanRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, 
                                                    BeanDefinitionRegistry registry) {

        Set<String> packagesToScan = getPackagesToScan(importingClassMetadata);

        registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);

        registerReferenceAnnotationBeanPostProcessor(registry);

    }

}

 

    1.2 @Service  注解的Bean注册

1.3 @Reference 注解的Bean注册

   

 1.4、ServiceBean、ReferenceBean,这两个类都实现了InitializingBean,所以在spring初始化完所有的单例bean并给@Autowire @Value等一系列注解赋值完后,就会调用到afterPropertiesSet() 方法,最终都会调用到export()、get()方法来实例话bean到内存。首先来看看官方给出service 、reference初始化过程

Expose service sequence

 

       Reference service sequence

 


 

    2、Dubbo的服务间调用就从invoke()方法开始,入口从哪里开始,这是关键,@Reference 注解的类,通过dubbo代理的类和jdk代理的原理一样,只不过在dubbo使用的是InvokerInvocationHandler,该类实现了jdk的InvocationHandler,这样就好理解,通过debug调试发现,Dubbo通过调用ReferenceAnnotationBeanPostProcessor.invoke()方法的反射,最后都会走InvokerInvocationHandler#invoke()方法。这样入口就出来了,我们来看下客户端调用的流程图,方便理解

 

3、有了以上的基础,我们再来看看dubbo官方给出的图,就容易理解了:

文章详情点击: http://www.xiaoyuge.com.cn/#/article/detail?articleId=75

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值