专栏首页捉虫大师Dubbo No provider问题排查思路
原创

Dubbo No provider问题排查思路

本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。

不想看字的同学可直接划到底部查看思维导图

问题分析

使用过Dubbo的朋友很多都碰到过如下报错:

No provider available for the service org.newboo.basic.api.MyDemoService from registry 127.0.0.1:2181 on the consumer 127.0.0.1 using the dubbo version 2.7.6. Please check if the providers have been started and registered.

从源码来看这个报错位于

org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#checkInvokers

protected void checkInvokers(List<Invoker<T>> invokers, Invocation invocation) {
    if (CollectionUtils.isEmpty(invokers)) {
        throw new RpcException(RpcException.NO_INVOKER_AVAILABLE_AFTER_FILTER, "Failed to invoke the method "
                + invocation.getMethodName() + " in the service " + getInterface().getName()
                + ". No provider available for the service " + getDirectory().getConsumerUrl().getServiceKey()
                + " from registry " + getDirectory().getUrl().getAddress()
                + " on the consumer " + NetUtils.getLocalHost()
                + " using the dubbo version " + Version.getVersion()
                + ". Please check if the providers have been started and registered.");
    }
}

当配置reference的check=false时调用它的代码位于

org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke

(为true时在启动时校验)

从代码能看出导致这个报错的直接原因是:invokers为空

此处invoker对应一个provider URL,当没有provider可用时,invokers为空

排查思路

这个问题看似简单,但实际情况异常复杂,碰到后无从下手,本文提供一种可行的排查思路。

排查大致分为两条线,provider端和consumer端。

provider端

出问题第一时间排查provider,因为provider的情况比较少,可以简单地排除一部分情况。

provider出问题只有一种情况:未注册到注册中心

所以对应的排查思路是去看provider有没有注册成功:

  • 如果有dubbo控制台或者注册中心查询页面,直接查询一下即可
  • 如果没有可视化界面,比如zk、etcd可通过相应的客户端连上去查看是否注册成功

以zk为例,可通过 ls /dubbo/${service}/providers 查看注册上的provider

img1.png

如果provider未注册成功,那么就需要排查,可能的原因有:

  • provider未启动成功,启动一下即可
  • provider虽然启动了,但注册失败了,查看一下错误日志,对症解决
  • 注册中心地址是否写错?环境是否一致?

如果provider已经注册,说明provider没问题,再看consumer。

consumer端

consumer端排查还需再细分,以是否订阅(拉取)到对应provider信息为界

如何查看consumer的订阅信息

consumer订阅信息可从缓存文件中查看,缓存文件默认按如下规则生成:

String defaultFilename = System.getProperty("user.home") + "/.dubbo/dubbo-registry-" + url.getApplication() + "-" + url.getAddress().replaceAll(":", "-") + ".cache";

例如:

~/.dubbo/dubbo-registry-ddog-my-demo-c0-127.0.0.1-2181.cache

有多个注册中心,将有多个缓存文件,文件内容如下:

#Dubbo Registry Cache
#Wed Aug 11 20:26:15 CST 2021
org.newboo.basic.api.MyDemoService=empty\://127.0.0.1/org.newboo.basic.api.MyDemoService?application\=ddog-my-demo-c0&category\=routers&check\=false&dubbo\=2.0.2&init\=false&interface\=org.newboo.basic.api.MyDemoService&loadbalance\=xxx&methods\=call&owner\=roshilikang&pid\=3084&qos.enable\=true&qos.port\=33333&release\=2.7.6&side\=consumer&sticky\=false&timestamp\=1628684774590 empty\://127.0.0.1/org.newboo.basic.api.MyDemoService?application\=ddog-my-demo-c0&category\=configurators&check\=false&dubbo\=2.0.2&init\=false&interface\=org.newboo.basic.api.MyDemoService&loadbalance\=xxx&methods\=call&owner\=roshilikang&pid\=3084&qos.enable\=true&qos.port\=33333&release\=2.7.6&side\=consumer&sticky\=false&timestamp\=1628684774590 dubbo\://127.0.0.1\:20880/org.newboo.basic.api.MyDemoService?anyhost\=true&application\=ddog-my-demo-p0&deprecated\=false&dubbo\=2.0.2&dynamic\=true&generic\=false&interface\=org.newboo.basic.api.MyDemoService&methods\=call&owner\=roshilikang&pid\=2058&release\=2.7.6&side\=provider&threads\=500&timestamp\=1628684412247

搜索文件中是否有对应服务的provider

未成功订阅

如果没拿到信息(搜索不到对应的provider),说明订阅存在问题,检查consumer日志是否有报错,注册中心地址,环境等配置是否有问题。

成功订阅

比如这个文件,存在

dubbo\://127.0.0.1\:20880/org.newboo.basic.api.MyDemoService?anyhost\=true&application\=ddog-my-demo-p0&deprecated\=false&dubbo\=2.0.2&dynamic\=true&generic\=false&interface\=org.newboo.basic.api.MyDemoService&methods\=call&owner\=roshilikang&pid\=2058&release\=2.7.6&side\=provider&threads\=500&timestamp\=1628684412247

说明consumer已经拿到了provider信息

当consumer拿到provider,也不一定就能保证调用不会报No provider,有这么几种情况需要排查

  • 检查consumer的group、version是否和provider完全匹配,不匹配会报No provider
  • 是否被禁用,搜索缓存文件中是否有该服务对应的override URL,且disabled=true
  • consumer是否配置了路由规则,如tag路由,条件路由等,路由规则可能导致No provider

group、version是否匹配,有一个不看代码就知道consumer的version、group配置的小技巧,如果consumer指定了version或group,报错信息如下(group=read,version=1.0):

No provider available from registry 127.0.0.1:2181 for service read/org.newboo.basic.api.MyDemoService:1.0 on consumer 127.0.0.1 use dubbo version 2.7.6

service前包含group,用斜线分隔,service后有version用冒号分隔。

以上可覆盖95%的场景,还有一种比较少见:consumer生成invoker失败导致invokers为空;

此种情况请仔细检查错误日志,不明的报错需要关注。此处列举一些碰到过的case

  1. Dubbo 2.6.x中transport实现了netty和netty4,而在2.6.10版本中,netty transport扩展名字被改为了netty3;如果provider使用dubbo 2.6.10且指定了transport为netty3,低版本的dubbo调用时因为没有实现netty3的扩展而导致invoker生成失败;此时consumer端看起来是拿到了provider的URL,但也会报No provider错误
  2. 与1类似,当自定义某些扩展只在provider使用时,provider的一些参数会传递给consumer,让consumer也使用相同扩展,但consumer不一定实现了该扩展,导致invoker生成失败;比如自定义的dispatcher扩展。

注:可能你会问为什么provider的参数会传递给consumer?这合理吗?举个例子,如果provider指定序列化协议为json,那consumer是否也要按照provider的序列化协议json来传输数据呢?只能说没有万全的设计

总结

跟很多问题排查思路一样,根据已有现象一步步缩小排查范围,最终锁定根本原因。用一副思维导图来总结:

img2.png

搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 启动dubbo消费端过程提示No provider available for the service的问题定位与解决

    某次在启动dubbo消费端时,发现无法从zookeeper注册中心获取到所依赖的消费者API,启动日志一直出现这样的异常提示

    朱季谦
  • redis在微服务领域的贡献

    说到redis,可能大家的脑海中蹦出的关键词是:NoSQL、KV、高性能、缓存等。但今天的文章从另一个角度——微服务来展开。

    龟仙老人
  • Dubbo 常见错误及解决方法

    Dubbo 作为高性能 RPC(Remote Procedure Call)框架已经成为 Apache 的顶级项目,意味着在全球被数以千计的公司所采用来其实现...

    kirito-moe
  • Dubbo框架常见问题

    在分布式架构时代,dubbo 作为RPC框架,以其高性能、易扩展、配置简单、易上手被越来越多的公司所青睐,在国内互联网公司中口碑一直很好。因为其高频使用,很多面...

    用户7676729
  • 当dubbo多注册中心碰上标签路由

    今天的主角是标签路由和dubbo的多注册中心。标签路由在之前的文章《以为是青铜,没想到是王者的dubbo标签路由》中已经详细介绍过,多注册中心是dubbo可以使...

    龟仙老人
  • Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以《Service Mesh 的本质、价值和应用探索》为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展...

    kirito-moe
  • 一次漫长的dubbo网关内存泄露排查经历

    在微服务架构中,不同的微服务有不同的网络地址,而客户端则是通过统一的地址进行调用,在客户端与服务端之间需要有一个通信的桥梁,这就产生了微服务网关。微服务网关可以...

    龟仙老人
  • Dubbo项目中No provider available for the service xxx from registry xxx on the consumer问题的解决思路

    最近在与电信做交维的时候, 由于一些原因, 项目挂了. 然后甲方爸爸让我们这边负责追查问题并且解决 (ps: 好想做回甲方爸爸~~)

    时间静止不是简史
  • 案例分享 | dubbo 2.7.12 bug导致线上故障

    最近某天的深夜,刚洗完澡就接到业务方打来电话,说他们的 dubbo 服务出故障了,要我协助排查一下。

    龟仙老人
  • Dubbo下一站:Apache顶级项目

    近日,在Apache Dubbo开发者沙龙杭州站的活动中,阿里巴巴中间件技术专家曹胜利(展图)向开发者们分享了Dubbo2.7版本的规划。

    heidsoft
  • 容器OOM问题排查思路

    外界的刁难,挑战。。。其实并不是最难的,最难的总是内部难以安抚,OOM。。。内存泄漏,OOM killer了解一下。。。攘外必先安内。。。我可能要死在内...

    SRE运维实践
  • 瓜子二手车在 Dubbo 版本升级、多机房方案方面的思考和实践

    随着瓜子业务的不断发展,系统规模在逐渐扩大,目前在瓜子的私有云上已经运行着数百个 Apache Dubbo ( 下文简称 Dubbo )应用,上千个 Dubbo...

    用户1516716
  • 升级dubbo,小心default.version!

    上周遇到个关于升级dubbo 2.6 到2.7的兼容性问题,差点造成线上故障,这里记录下,也给大家提个醒。

    龟仙老人
  • 如何将一个 Dubbo 项目改造成一个 Service Mesh 项目?

    本篇介绍如何将一个 Dubbo 项目改造成一个 SpringBoot + K8S + Istio 项目的全过程,实现了在不改变 Dubbo 项目整体代码结构的基...

    axlyzhang
  • 一文聊透 Dubbo 元数据中心

    如果让你在本地构建一个 Dubbo 应用,你会需要额外搭建哪些中间件呢?如果没猜错的话,你的第一反应应该是注册中心,类 Dubbo 的大多数服务治理框架都有注册...

    kirito-moe
  • 一步步完成Maven+Spring+Dubbo+Zookeeper的整合示例

    本文给出一个整合Maven+Spring+Dubbo+Zookeeper的示例,并且一步步给出完成步骤,并对其中可能遇到的问题进行解决。

    孟君
  • 好吧,我对 Dubbo 了解的并不多

    9月份的时候,我接到了大量的提问。其中大部分是围绕 Spring Boot、Spring Cloud、Dubbo、Zookeeper、Redis,而这些问题直接...

    FoamValue
  • 给dubbo贡献源码,做梦都在修bug

    在之前的文章《redis在微服务领域的贡献》中,从一次面试经历中了解了redis可以在微服务中玩的这么溜,同时也从源码角度分析了dubbo的redis注册中心。...

    龟仙老人
  • 1.Dubbo 常见错误及解决方法

    地址找不到:No provider available 找不到服务,这时候可能有这么几种情况: Provider 服务没启动,或者注册中心Nacos宕机了。...

    关忆北.

扫码关注云+社区

领取腾讯云代金券