Dubbo远程调用找不到服务异常

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&timestamp=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&timestamp=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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值