springboot整合dubbo

来源:互联网 发布:结伴编程 编辑:程序博客网 时间:2024/04/28 21:11

本文主要通过代码示例来说明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));    }}

本文就讲解到此,更深一步的信息,有兴趣的可以跟踪上面的源码,如有疑问可以留言,期待与广大读者一起学习进步

点我查看源码

0 1