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

小咪咪 2023-01-23 13:50 78阅读 0赞

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

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

1. 问题描述

settings服务通过dubbo调用tense服务异常,找不到服务,异常日志如下

  1. 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 注册中心是否注册成功,

  1. dubbo支持zknacos,我们使用的nacos,服务注册正常。
  2. nacos服务详情如下
  3. 1) marketing-activity-settings,nacos服务详情
  4. management.endpoints.web.base-path=/monitor
  5. 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" ]
  6. dubbo.protocols.dubbo.port=20880
  7. preserved.register.source=SPRING_CLOUD
  8. 2) marketing-activity-tense,nacos服务详情
  9. management.endpoints.web.base-path=/monitor
  10. 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" ]
  11. dubbo.protocols.dubbo.port=20880
  12. preserved.register.source=SPRING_CLOUD

2.3 分别验证服务提供者与消费者

单独调用provider或者customer服务正常,可以执行成功。

2.4 消费者和提供者依赖是否一致

  1. 消费者的版本号和提供者保持一致,versiongroup需保持一致。
  2. 项目中只配置了version没有配置group,根据Apollo配置group后发现不起作用,既是可以不用配置,项目配置如下:
  3. @DubboReference(version = "1.0.0", check = false)
  4. private DrawCacheClearService drawCacheClearService;

3.5 检查引入依赖与注解是否正确

  1. 1)application启动类上面是否缺少注解@DubboComponentScan
  2. 2)调用方的注解是否是dubbo@Reference
  3. 3)service层的注解是否是dubbo@Service(不是spingboot的);
  4. 4)调用方和service层的注解版本是否一致;

3.6 检查dubbo开启注解扫描路径

  1. 检查启动类dubbo开启注解@EnableDubbo,发现扫描包路径不对!!!
  2. @EnableDubbo(scanBasePackages = {"com.enn.sale.marketing.activity.tense.facade"})

3.7 是否订阅dubbo服务

  1. 有人认为是没有订阅dubbo服务,这种说法有点诧异。解释下。
  2. dubbo官网也能看到dubbo只有服务暴露,服务调用,哪来的服务订阅一说。
  3. 仔细想了下发现可能是表达的是订阅注册中心,对,只有注册中心才有订阅一说,dubbo不存在订阅一说。
  4. # 用于服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 "," 分割。
  5. # 不推荐使用默认值为 "*"或者"",它将订阅所有应用。
  6. # 这里默认使用了当前应用名,请根据需要增加对应的应用名
  7. #dubbo.cloud.subscribed-services= ${provider.application.name}
  8. dubbo.cloud.subscribed-services= *
  9. dubbo.cloud.subscribed-services= ""
  10. 经过查看Apollo配置中心发现配置为:dubbo.cloud.subscribed-services= ""
  11. 所以也不存在问题,经验证发现是否指定应用都不存在问题。

4. 问题方案

修改@EnableDubbo扫描包路,找到服务。
前期一直在想localhost:9090是什么服务,原来是没扫描到默认地址,项目中也没搜索到这个默认地址。

参考文档:
Spring-Cloud-Alibaba笔记01-关于远程调用Dubbo
dubbo官网:https://dubbo.apache.org/zh/docs/v2.7/user/configuration/annotation/

发表评论

表情:
评论列表 (有 0 条评论,78人围观)

还没有评论,来说两句吧...

相关阅读

    相关 dubbo远程调用接口

    最近做了一个项目需要使用dubbo调用远程接口,写出来分享一下 首先需要提供接口的人给你接口地址,注册中心地址,以及参数类型,参数类型可以是实体类,可以让客户直接把实体类发给