Dubbo作为一个分布式服务框架(RPC)框架,在使用的过程中非常简单,可以像使用本地的Bean一样调用远程的服务,需要的仅仅是一些简单的配置。
如下:
Remote-Provider.xml
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <!-- 和本地服务一样实现远程服务 -->
<dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” /> <!-- 增加暴露远程服务配置 -->
Local-Consumer.xml
<dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” /> <!-- 增加引用远程服务配置 -->
<bean id=“xxxAction” class=“com.xxx.XxxAction”> <!-- 和本地服务一样使用远程服务 -->
<property name=“xxxService” ref=“xxxService” />
</bean>
Dubbo的配置支持以下标签
<dubbo:application />
<dubbo:module />
<dubbo:registry />
<dubbo:monitor />
<dubbo:provider />
<dubbo:consumer />
<dubbo:protocol />
<dubbo:service />
<dubbo:reference />
<dubbo:annotation />
我们来看下Spring是怎么支持<dubbo>这种标签的解析的。
Spring提供了可扩展的schema支持,Dubbo(包括其他框架:mybatis, hibernate, struts等)就是利用Spring提供的schema支持,对Spring支持的自定义扩展配置进行了扩展。扩展需要以下几个条件。
- 配置属性和对应解析后的JavaBean
- XSD文件,用来描述配置属性的定义
- 实现Spring提供的命名空间接口来解析配置文件,NameSpaceHandler和BeanDefinitionParser
- 使用spring.handler和spring.schemas来关联起各个部件的调用
1. 配置属性和对应解析后的Bean
我们以上面配置的<dubbo:service />为例,来看下ServiceConfig.java中定义的属性,在使用此标签的时候,以下属性都是可以配置的,详细属性配置。
标签 | 属性 | 类型 | 是否必填 | 作用 | 描述 |
---|---|---|---|---|---|
<dubbo:service> | interface | class | 必填 | 服务发现 | 服务接口名 |
<dubbo:service> | ref | object | 必填 | 服务发现 | 服务对象实现引用 |
<dubbo:service> | version | string | 可选 | 服务发现 | 服务版本 |
2. XSD用来描述XML配置文件属性
dubbo的XSD有嵌套引用,这里只列取出了关键的配置,ref,interface,配置文件是放在jar包的META-INF下面。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://code.alibabatech.com/schema/dubbo"
...........
<xsd:complexType name="serviceType">
<xsd:complexContent>
<xsd:extension base="abstractServiceType">
<xsd:attribute name="interface" type="xsd:token" use="required">
</xsd:attribute>
<xsd:attribute name="ref" type="xsd:string" use="optional">
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
3. 实现Spring提供的命名空间接口来解析配置文件,DubboNameSpaceHandler和DubboBeanDefinitionParser
DubboNameSpaceHandler.java
public class DubboNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
}
}
Spring初始化的时候会自动执行实现了NameSpaceHandlerSupport.java接口类的init方法。DubboNamespaceHandler只是负责找到某个节点对应的位置,具体的解析是由DubboBeanDefinitionParser.java来执行的。
先来提一下dubbo是怎么注册和引用服务的,ServiceBean.java实现了InitializingBean接口,在Spring实例化执行完之后,会自动执行afterPropertiesSet方法,这个方法里实现了服务的注册和引用。
4. 使用spring.handler和spring.schemas来关联起各个部件的调用
spring.schemas
http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd
spring.handler
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
在第五步我们在Spring的配置文件中使用Dubbo的标签时,Spring默认是不识别我们自己定义的这些标签,需要通过这两个配置文件来映射出配置的规则和解析类,即5中用到了http://code.alibabatech.com/schema/dubbo/dubbo.xsd时会找到META-INF/dubbo.xsd。
这两个文件放在META-INF/下面,Spring会去加载。
5. 在Spring配置文件中加载Dubbo配置
通过以上的关联就可以在Spring中像使用原生标签一样使用Dubbo的标签了。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
<!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
</beans>
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
这一句配置即以dubbo为标签的命名空间,<dubbo:**** />