本文已收录 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



如果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来传输数据呢?只能说没有万全的设计

总结

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

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

Dubbo No provider问题排查思路的更多相关文章

  1. Mysql 高负载排查思路

    Mysql 高负载排查思路 发现问题 top命令 查看服务器负载,发现 mysql竟然百分之两百的cpu,引起Mysql 负载这么高的原因,估计是索引问题和某些变态SQL语句. 排查思路 1. 确定高 ...

  2. 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路

    前言 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警. 本文主要针对系统运 ...

  3. RPC服务超时排查思路

    RPC服务超时排查思路- 1.查看服务提供者日志相关信息进行排查- 2.查看消费者的超时时间设置是否合理- 3.查看服务提供者业务逻辑是否有DB操作,有的话看是否有慢SQL- 4.查看服务提供者业务逻 ...

  4. Java线上问题排查思路及Linux常用问题分析命令学习

    前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...

  5. 关于dubbo的provider和consumer都配置timeout超时时间的情况

    本文转自:http://blog.csdn.net/lkforce/article/details/54380201 前言 在dubbo的provider和consumer的配置文件中,如果都配置了t ...

  6. windows应急响应入侵排查思路

    0x00 前言 ​ 当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解 ...

  7. Linux应急响应入侵排查思路

    0x00 前言 ​ 当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解 ...

  8. Linux 服务器性能问题排查思路

    一个基于 Linux 操作系统的服务器运行的同时,也会表征出各种各样参数信息.通常来说运维人员.系统管理员会对这些数据会极为敏感,但是这些参数对于开发者来说也十分重要,尤其当你的程序非正常工作的时候, ...

  9. 6.【应急响应】Linux入侵排查思路

    0x01 入侵排查思路 一.账号安全 基本使用: 1.用户信息文件/etc/passwd root:x:0:0:root:/root:/bin/bash account:password:UID:GI ...

随机推荐

  1. Java面向对象02——回顾方法(定义、调用)及加深

    方法的定义  package oop.demon01; ​ //Demon01 类 public class Demon01 {          //main 方法     public stati ...

  2. Convert a Private Project on bitbucket.com to a github Public Project

    Create a public repo on github, you can add README or License files on the master branch, suppose th ...

  3. cpu设计实践1

    本栏目将实现一个简单cpu(8-32位)的设计,使用xinlink spatan6平台

  4. minio-对象存储

    1. 简介 官方地址 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件. ...

  5. Mysql生成UUID的SQL语句

    大写的UUID: SELECT UPPER(UUID()); 小写的UUID: SELECT LOWER(UUID()); SELECT UUID(); 去掉横杠的UUID: SELECT REPLA ...

  6. flutter获取状态栏高度及安全区域

    获取状态栏高度: final double statusBarHeight = MediaQuery.of(context).padding.top; 所谓安全区域,就是适配现在一些刘海屏之类的非常规 ...

  7. UWP App Data存储和获取

    这篇博客介绍如何在UWP开发时,如何存储App Data和获取. App Data是指用户的一些设定,偏好等.例如,App的主题,是否接收推送,离线接收消息等.需要区分下App Data和User D ...

  8. PL/SQL 安装使用

    PL/SQL 安装 前提:安装Oracle 使用 登录 oracle连接地址格式 ip:端口/ServerName,如192.168.136.130:1521/xe 新建菜单 Sql-Window 编 ...

  9. 设置Sublime插件快捷键--实现CSS颜色选取

    安装插件ColorPicker 如果你经常要查看或设置颜色值,这个插件可以很方便地调用你本机的调色板应用.(译者扩充:)这是一个双向的功能,你既可以在调色板中选择一个颜色,然后按"确定&qu ...

  10. go-Gorm

    软删除 如果模型中有 DeletedAt 字段,它将自动拥有软删除的能力!当执行删除操作时,数据并不会永久的从数据库中删除,而是将 DeletedAt 的值更新为当前时间.