Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架
,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring
框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
这是Dubbo的一个简单介绍,第一篇首先讲一下Dubbo是如何和Spring框架进行无缝集成的。在我们进行Spring-Dubbo项目开发的时候,需要通过XML来配置,比如
那么Spring是如何对这个配置处理从而转化成整个容器里可以拿来使用的Bean那?
在Spring处理xml文件的时候会根据命名空间来判断是否是默认的,如import
,beans
。对于非Spring默认的会来进行如下的代码执行:
public BeanDefinitionparseCustomElement(Element ele, BeanDefinition containingBd) {
String namespaceUri = getNamespaceURI(ele);
NamespaceHandler handler =this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
if (handler ==null) {
error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri +"]", ele);
return null;
}
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}
首先根据namespaceUri 来寻找实现了NamespaceHandler的handler,然后在这个resolve()
方法中完成handler的init()
初始化。我们可以来看看实现了NamespaceHandler的DubboNamespaceHandler中init方法都做了什么。
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));
}
在parsers 中注册了很多的BeanDefinitionParser来进行Dubbo的XML配置中节点解析。在DubboBeanDefinitionParser中的parse()方法根据beanClass的不同完成不同bean的属性装配。