dubbo适配Spring原理

西魏陶渊明 ... 2022-8-22 Java 大约 2 分钟

前面两篇博文,主要讲dubbo服务端和客户端的知识点,在对服务端和客户端有了一个新的认识之后,我们本篇 来看下spring是如何整合dubbo服务的

# 一、整合dubbo的两种方式

spring中使用dubbo一共有两种方式。这两种方式只是在解析dubbo类时候不同。一种通过xml方式,一种注解标签方式。 下面我们说下他们的原理。

  1. xml方式
  2. 注解方式

# 二、两种方式原理

# 1. NamespaceHandler(xml方式)

NamespaceHandler是spring提供的解析标签的类。dubbo首先继承该接口。在初始化时候 给每个标签绑定一个解析器。

public class DubboNamespaceHandler extends NamespaceHandlerSupport {

	static {
		Version.checkDuplicate(DubboNamespaceHandler.class);
	}

	public void init() {
	    registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
        registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
        registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
        registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
        registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
        registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
        registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

到这里spring就能解析各种的dubbo标签了。

# 2. 解析注解方式

  • 服务端: BeanPostProcessor#postProcessAfterInitialization在服务端初始化后来根据Service注解生成服务并导出。
  • 客户端: BeanPostProcessor#postProcessBeforeInitialization客户端在初始化前解析Reference,并注入到bean中

# 三、服务端ServiceBean

服务端使用@Service或者是xml解析参数生成ServiceBean,用Spring进行管理处理容器完成事件和bean初始化事件来来导出服务。

ServiceBean是一个被Spring管理的bean。

  • 实现了InitializingBean#afterPropertiesSet初始化方法
  • 实现了DisposableBean#destory销毁方法
  • 实现了ApplicationListener的事件方法onApplicationEvent
  • 实现了ApplicationContextAware注入上下文
  • 实现了BeanNameAware注入beanName

其中当Spring容器启动了,会发出ContextRefreshedEvent事件

# 四、客户端ReferenceBean

客户端使用Reference生成ReferenceBean,ReferenceBean是一个FactoryBean。

ReferenceBean#getObject来生成代理类。

   public Object getObject() throws Exception {
        return get();
   }
   public synchronized T get() {
        if (destroyed){
            throw new IllegalStateException("Already destroyed!");
        }
    	if (ref == null) {
    		init();
    	}
    	return ref;
    }

1
2
3
4
5
6
7
8
9
10
11
12
13

# 五、总结

导出服务和创建远程服务的本地代理。原理是就是netty实现的。这是dubbo的逻辑。本篇就不说了。本篇的重点是 spring是如何整合dubbo的。你学习到了吗?


本文由西魏陶渊明版权所有。如若转载,请注明出处:西魏陶渊明
上次编辑于: 2022年8月22日 09:35
贡献者: lxchinesszz