Dubbo远程调用找不到服务异常
1. 问题描述
settings服务通过dubbo调用tense服务异常,找不到服务,异常日志如下
org.apache.dubbo.rpc.RpcException: No provider available from registry localhost:9090 for service com.enn.sale.marketing.activity.tense.client.service.DrawCacheClearService:1.0.0 on consumer 10.202.4.93 use dubbo version 2.7.8, please check status of providers(disabled, not registered or in blacklist).
2. 问题分析
RpcException: No provider available from registry localhost:9090 for service 。
意思就是在这个地址上localhost:9090不存在调用的服务。
tense服务调用地址与注册中心地址不一致,本地又没有指定url。
3. 问题排查
问题就三个方向:要么服务有问题,要么客户端有问题,或者是注册中心有问题。
3.1 服务提供者消费者是否正常
privider与consumer服务启动正常。
3.2 注册中心是否注册成功,
dubbo支持zk与nacos,我们使用的nacos,服务注册正常。
nacos服务详情如下
1) marketing-activity-settings,nacos服务详情
management.endpoints.web.base-path=/monitor
dubbo.metadata-service.urls=[ "dubbo://10.202.10.15:20880/com.alibaba.cloud.dubbo.service.DubboMetadataService?anyhost=true&application=marketing-activity-settings&bind.ip=10.202.10.15&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=marketing-activity-settings&interface=com.alibaba.cloud.dubbo.service.DubboMetadataService&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExportedURLs&pid=1&qos.enable=false&release=2.7.8&revision=2.2.5.RELEASE&side=provider×tamp=1626313186563&version=1.0.0" ]
dubbo.protocols.dubbo.port=20880
preserved.register.source=SPRING_CLOUD
2) marketing-activity-tense,nacos服务详情
management.endpoints.web.base-path=/monitor
dubbo.metadata-service.urls=[ "dubbo://10.202.4.89:20880/com.alibaba.cloud.dubbo.service.DubboMetadataService?anyhost=true&application=marketing-activity-tense&bind.ip=10.202.4.89&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=marketing-activity-tense&interface=com.alibaba.cloud.dubbo.service.DubboMetadataService&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExportedURLs&pid=1&qos.enable=false&release=2.7.8&revision=2.2.5.RELEASE&side=provider×tamp=1626262898073&version=1.0.0" ]
dubbo.protocols.dubbo.port=20880
preserved.register.source=SPRING_CLOUD
2.3 分别验证服务提供者与消费者
单独调用provider或者customer服务正常,可以执行成功。
2.4 消费者和提供者依赖是否一致
消费者的版本号和提供者保持一致,version和group需保持一致。
项目中只配置了version没有配置group,根据Apollo配置group后发现不起作用,既是可以不用配置,项目配置如下:
@DubboReference(version = "1.0.0", check = false)
private DrawCacheClearService drawCacheClearService;
3.5 检查引入依赖与注解是否正确
1)application启动类上面是否缺少注解@DubboComponentScan;
2)调用方的注解是否是dubbo的@Reference;
3)service层的注解是否是dubbo的@Service(不是spingboot的);
4)调用方和service层的注解版本是否一致;
3.6 检查dubbo开启注解扫描路径
检查启动类dubbo开启注解@EnableDubbo,发现扫描包路径不对!!!
@EnableDubbo(scanBasePackages = {"com.enn.sale.marketing.activity.tense.facade"})
3.7 是否订阅dubbo服务
有人认为是没有订阅dubbo服务,这种说法有点诧异。解释下。
从dubbo官网也能看到dubbo只有服务暴露,服务调用,哪来的服务订阅一说。
仔细想了下发现可能是表达的是订阅注册中心,对,只有注册中心才有订阅一说,dubbo不存在订阅一说。
# 用于服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 "," 分割。
# 不推荐使用默认值为 "*"或者"",它将订阅所有应用。
# 这里默认使用了当前应用名,请根据需要增加对应的应用名
#dubbo.cloud.subscribed-services= ${provider.application.name}
dubbo.cloud.subscribed-services= *
dubbo.cloud.subscribed-services= ""
经过查看Apollo配置中心发现配置为:dubbo.cloud.subscribed-services= ""。
所以也不存在问题,经验证发现是否指定应用都不存在问题。
4. 问题方案
修改@EnableDubbo扫描包路,找到服务。
前期一直在想localhost:9090是什么服务,原来是没扫描到默认地址,项目中也没搜索到这个默认地址。
参考文档:
Spring-Cloud-Alibaba笔记01-关于远程调用Dubbo
dubbo官网:https://dubbo.apache.org/zh/docs/v2.7/user/configuration/annotation/