本文主要通过代码示例来说明springboot和dubbo的整合方式
以下是核心代码示例,其他的资源整合配置和spring+Dubbo相同
声明下:dubbo网址在下面配置中为占位符描述,可针对自己的网络环境配置
推荐地址code.alibabatech.com 原因会在下面说明
控制类
@SpringBootApplication
@EnableConfigurationProperties
@ImportResource({ "classpath:applicationContext.xml" })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
applicationContext.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-autowire="byName">
<import resource="classpath:dubbo/dubbo.xml"/>
dubbo.xml
<?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://dubbo网址/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://dubbo网址/schema/dubbo http://dubbo网址/schema/dubbo/dubbo.xsd"
default-autowire="byName">
<dubbo:application id="dubboApplication" name="${spring.application.name}" />
<dubbo:registry id="wbPortalRegistry" address="${dubbo.registry.address}" />
<import resource="classpath:/dubbo/dubbo-provider.xml"/>
<import resource="classpath:/dubbo/dubbo-consumer.xml"/>
</beans>
dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo网址/schema/dubbo" xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://dubbo网址/schema/dubbo http://dubbo网址/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
"
default-autowire="byName">
<dubbo:reference id="*"
interface="*.api.*"
protocol="dubbo" version="${dubbo.version}" timeout="5000"
check="false" />
</beans>
dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo网址/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://dubbo网址/schema/dubbo http://dubbo网址/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
"
default-autowire="byName">
<dubbo:service interface="***"
ref="*Impl" timeout="30000" protocol="dubbo" version="${provider.version}" />
</beans>
注:本文是在阿里内网环境下启动OK的,然后放在外面启动确会出现异常。以下就是对问题的起因和描述
截图为异常的现象
在翻看dubbo的文档的时候发现这种问题的官方介绍如下
出现org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element怎么办?
通常是在用Dubbo1.0的jar包,却用了Dubbo2.0才支持的<dubbo:registry> <dubbo:application> <dubbo:provider> <dubbo:consumer>或2.0才支持的属性。
然而我遇到这个问题的原因却不是这样的,因为我上面总结的文档是在工作环境中做的,然而文档中的dubbo网址位置的资源在外网中没有,因而会出现这种异常现象
解决方案就是本文开头声明的那样使用推荐地址即可
下面讲述下使用推荐地址的原因
这个是dubbo.jar中的结构,我标注的位置就是dubbo自定义标签的实现
然后打开spring.schemas文件
http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd
这就是标签规则xsd文件的配置
前面的地址就是我们要在配置文件中替换的地址,也可以这么说,系统启动的时候读取的xsd文件是jar中的文件,而不是配置文件中的远程资源,这也就是可以解释为什么好多的xsd配置资源我们当前环境是访问不到的,但是项目运行却没有任何的影响了
顺手在说下spring.handlers这个文件
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
这个里边的配置其实就是xsd规则的解析过程,源码如下
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));
}
}
本文就讲解到此,更深一步的信息,有兴趣的可以跟踪上面的源码,如有疑问可以留言,期待与广大读者一起学习进步