dubbo踩坑教训

前言

这篇文章主要总结一下自己踩过的dubbo的坑,因为不管是在配置的时候或者说调用的时候都会出现很多问题,碰到过很多坑,特此总结一下.持续更新.
说明一下,这里使用的dubbo是apache旗下的,不是alibaba旗下的.

dubbo 配置消费方显示端口已经占用

错误如下 :

这个原因是因为在默认配置的情况下使用的qos端口号都是22222.但是在消费方想要用这个端口的时候,服务提供方已经占用了,这个时候就需要去配置一下qos来实现部署的.

qos就是Dubbo的在线运维命令. 可以对服务进行动态的配置,控制以及查询.

具体配置如下:

使用dubbo.properties文件进行配置

加上一下属性就好了

1
2
3
dubbo.application.qos.enable=true
dubbo.application.qos.port=33333
dubbo.application.qos.accept.foreign.ip=false

使用XML进行配置

将其中一方的qos端口设置为没有被占用的任何一个就可以了.

1
2
3
4
5
<dubbo:application name="demo-provider" >
<dubbo:parameter key="qos.enable" value="true"/>
<dubbo:parameter key="qos.accept.foreign.ip" value="false"/>
<dubbo:parameter key="qos.port" value="33333"/>
</dubbo:application>

使用springboot自动装配方式

1
2
3
dubbo.application.qosEnable=true
dubbo.application.qosPort=33333
dubbo.application.qosAcceptForeignIp=false

com.alibaba.com.caucho.hessian.io.HessianProtocolException 无法反序列化问题

这个原因也有,这原因主要是因为Hessian的序列化的方式的问题.
dubbo是采用Hessian(比jdk自带反序列化高效)进行反序列化的,该反序列化创建对象时,会取参数最少的构造方法来创建对象,构造方法参数设置默认值,基本类型设置为相应基本类型的默认值,不是基本类型设置为null.所以这里就会出现null对象,导致无法被序列化.
只要在序列化对象上添加一个无参构造方法就好了.当然如果没有自定义的构造方法,会有默认的构造方法,所以也不会出错.

dubbo 显示两个重复的配置

1
Duplicate application configs: <dubbo:application valid="true" name="demo-provider" prefix="dubbo.application" id="demo-provider" /> and <dubbo:application owner="debug" valid="true" organization="dubbox" name="dubboOne-consume" prefix="dubbo.application" id="dubboOne-consume" />

这个是因为一个应用要求只有一个application配置,这个问题我觉得可能是出现在自己不是很了解的情况下,一个应用配置了两个application. 向我刚开始一样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">


<dubbo:registry address="${dubbo.registry.address}"/>
<dubbo:protocol name="rest" threads="500" contextpath="v1" server="tomcat" accepts="500"/>
<dubbo:protocol name="dubbo"/>

<!--看这里 -->
<dubbo:application name="demo-provider"/>
<dubbo:application name="dubboOne-consume" owner="debug" organization="dubbox" />
</beans>

这里配置了两个application.导致出错了.只需要删掉其中一个就好了.这个时候就又有人问了.这么配置的主要原因就是为了一个应用即充当提供方有当消费方. 这里就需要另外一个配置了.
参考官方文档: 提供方提供配置的时候.需要用到 dubbo:service 来进行接口暴露.

1
2
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" />

消费方使用服务的时候需要用到reference配置来使用:

1
<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" />

所以当一个应用即充当消费方又是服务提供方不需要配置两个application.只需要配置好要引用的rpc服务和自己所需要暴露的接口就好了.