前言:在当下微服务盛行的局势下,服务之间的通行异常频繁,而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