springboot整合dubbo

15 篇文章 0 订阅
6 篇文章 0 订阅

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

}

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

点我查看源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值