dubbo踩坑
记录一下学习dubbo中踩的坑
版本
版本务必要匹配,否则总会出一些问题,目前使用的版本如下:
openjdk version 11.0.10
SpringBoot: 2.1.6.RELEASE
dubbo: 2.7.7
dubbo-spring-boot-starter: 2.7.7
nacos-client: 1.4.1
dubbo-serialization-kryo: 2.7.9
com.github.briandilley.jsonrpc4j:jsonrpc4j:1.2.0
仅在使用http协议时引用。高版本上HttpException访问权限为default
org.eclipse.jetty:jetty-servlet
注意,官网标定版本是6.1.26,但是此版本的groupdId和包名是org.mortbay.jetty
整体基于spring.properties配置
ps: 在此必须骂一下dubbo的文档,dubbo高版本上已经在源码上集成了若干注册中心的代码,但是文档里居然还在要求引入相关的依赖,而且demo的版本还在0.0.2
多协议
官网上只列出了xml下的多协议
经过测试,服务提供者spring配置应该如下
1 | |
某项服务如果提供了多协议,那么消费者默认都是dubbo协议,暂时没有找到切换的方法
http协议踩坑
在使用http协议时,消费者忘记引入jsonrpc,结果出现找不到服务提供者错误No provider available for the service,
经过一天 的排查,问题出现在org.apache.dubbo.registry.integration.RegistryDirectory:429。由于org.apache.dubbo.rpc.protocol.http.HttpProtocol引入了jsonrpc4j的依赖
dubbo里的http协议意思是rpc过程通过http协议传输,对应的接口并不能对web提供,哪怕官网确实写了可以。想要实现需要使用REST协议,但是需要对代码作改动
dubbo-admin 测试不支持http协议,一旦只提供http协议的,测试就会出现服务找不到错误,但是消费者实际使用时没有问题
日志
配置项中务必加上
1 | |
否则 dubbo 不会输出日志
多实现
假设一个接口有多个实现,那么之间必须进行分组,否则只会注册一个实现。
现在我有两个FileStorage的实现类
分别注解如下
1 | |
1 | |
nacos 显示如下

但是在dubbo-admin中又只显示qn实现,只有一次显示了两个实现
消费者引用如下
1 | |
测试结果显示,两个变量都是 QiNiuFileStorage 的实现,查看nacos,消费者只订阅了minio

多次测试后发现,此时是dubbo的负载均衡作祟,多个实现轮流调用
测试后修改配置如下
1 | |
1 | |
1 | |
实际起作用的是path = “qnFileStorage”,怀疑可能是dubbo通过path去寻找对应的实现类,默认情况下path相同,被是为同一实现的不同实例,启用负载。
但是dubbo-admin 仍然只能看到一个实现
多版本
当服务端配置了版本
1 | |
消费者也必须指定版本
1 | |
文档上注明 不关注版本时可以 写成 *****
但实际上 会出现以下错误
1 | |
可以看出 nacos 不支持该特性
多次订阅
在启用了@EnableDubbo以及dubbo.consumer.generic=true的情况下
当同一个接口在不同的地方使用 @DubboReference ,会提示重复引入