Dubbo集成到Spring

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:**** />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值