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

1. 问题描述2. 问题分析3. 问题排查

3.1 服务提供者消费者是否正常3.2 注册中心是否注册成功,2.3 分别验证服务提供者与消费者2.4 消费者和提供者依赖是否一致3.5 检查引入依赖与注解是否正确3.6 检查dubbo开启注解扫描路径3.7 是否订阅dubbo服务 4. 问题方案

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/

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: