【Spring Cloud Alibaba】(五)Dubbo启动报错?一直重连报错?你值得学习的是排查问题的方法

系列目录
【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战
【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战
【Spring Cloud Alibaba】(三)OpenFeign扩展点实战 + 源码详解
【Spring Cloud Alibaba】(四)Dubbo框架介绍 及 整合Dubbo和OpenAI实战【文末附源码】
本文目录
- 系列目录
- 前言
- 一、启动报错
- 1. 两种场景
- 2. 报错信息
- 3. 排查问题
- 4. 补充说明
- 二、一直重连报错
- 1. 两种场景
- 2. 报错信息
- 3. 排查问题
- 4. 补充说明
- 总结
- 最后
前言
书接上文,关于Dubbo,真心好用,真心强大!但是人红是非多,偶尔还能听到关于Dubbo的各种坑的说法。
比如,消费方启动报错:Failed to check the status of the service xxx. No provider available for the service。。。
再比如,消费方启动成功后,但一直与提供方重连报错:Fail to connect to HeaderExchangeClient。。。
你真的以为这是Dubbo的坑吗?
加一个小插曲,我想做一下调查:当你遇到技术问题时你会怎么做?
-
报错了没见过,管它三七二十一,网上直接搜,施展搜索大法~~~
然后,网上各种文章鱼龙混杂,运气好直接解决,运气不好方法试个遍也没效果…
-
向同事请教,一次一次请教,倍感无奈…
-
对报错快速排查一下(运气好直接解决),不行再有针对性的查找资料,遇到难点再向同事(或CSDN大佬)请教。
本文就以这两个Dubbo常见问题入手,带你进入源码分析如何排查问题 !一起拉开有趣的程序人生,Let’s go!

一、启动报错
1. 两种场景
在消费方启动时,可能会遇到以下两种场景:
- 没有可用的服务提供方,即注册中心没有注册 依赖的提供方
例如:提供方正在部署中,或者提供方也是启动报错 - 网络不通,导致消费方与提供方连接不上
例如:Local环境与DEV环境的网不通,因为服务器上通常都是部署在Docker里.
不管怎么样,得先让服务启动起来吧~~~
2. 报错信息
那么,消费方启动失败,会抛出 IllegalStateException,报错信息大致如下:
Error creating bean with name ‘xxxBean’: Injection of @DubboReference dependencies is failed; nested exception is java.lang.IllegalStateException:
Failed to check the status of the servicexxxInterfaceName.No provider available for the servicexxxInterfaceName from the url xxxUrl to the consumer xxxLocalhost use dubbo version xxxVersion
例如,我未启动提供者,重现的报错截图如下:

3. 排查问题
搜索报错信息Failed to check the status of the service,可以快速定位到报错的源码,如下图:

看到if判断条件 shouldCheck()方法了吧? 从命名就可以看出来,这是判断是否应该检查,进去看看:

没有几行代码,我想你能想到:
① :isCheck() 没有配置,默认为null
② :由于① 为null,所以主要看getConsumer()
③ :如果① 和②均没配置,第3步默认设为true,即检查是否可用!
所以,对于我们来说,主要可配置点在 getConsumer().isCheck() ,
即ConsumerConfig类的isCheck()方法:
public Boolean isCheck() {return check;
}
ConsumerConfig类,从名子可以看出来:消费者配置类.
稍微找一找就可以找到,在@EnableDubbo注解上有一个@EnableDubboConfig注解,里面注释写着:

再到注释对应的源码里验证一下,如果你从@EnableDubboConfig上的DubboConfigConfigurationRegistrar进去,可以看到DubboConfigConfiguration:

再跟进去,从这里就可以找到对应的源码:ConsumerConfig类绑定的配置前缀为dubbo.consumer,如下图:

4. 补充说明
综上,配置dubbo.consumer.check = false 就代表消费方启动时不检查提供方是否可用!
- application.properties
dubbo.consumer.check = false
这里补充说明如下:
Dubbo服务消费方在启动时,缺省会检查依赖的服务提供方是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认
check=true。可以通过
check=false关闭检查,比如:测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
二、一直重连报错
1. 两种场景
当通过check=false启动消费方后,还可能会遇到以下两种场景:
- 网络不通,导致消费方与提供方连接不上(上面提到的第2点)
例如:Local环境与DEV环境的网不通,因为服务器上通常都是部署在Docker里。 - 获取到的是已下线的提供方
例如:消费方启动时,提供方也在重新部署,这时就有可能获取到刚下线的提供方.。
大部分情况:等待一小会,会自动更新为新部署的提供方,但是偶尔也存在一直无法更新过来的情况。
如果对报错的提供方 不关心,就真的不想看到一直重连的报错!
2. 报错信息
消费方启动成功,但与提供方连接失败,会一直报错并抛出 RemotingException,报错信息大致如下:
header.ReconnectTimerTask : [DUBBO] Fail to connect to HeaderExchangeClient [channel=org.apache.dubbo.remoting.transport.netty4.NettyClient [xxx -> /xxx:20880]], dubbo version: xxxVersion, current host: xxxLocalhost
org.apache.dubbo.remoting.RemotingException: client(url: xxxURL) failed to connect to server /xxx:20880 client-side timeout 3000ms (elapsed: 3012ms) from netty client xxx using dubbo version xxxVersion
例如,我这里消费方在本地环境,提供方在DEV环境,重现的报错截图如下:

3. 排查问题
全局或者直接到报错的ReconnectTimerTask类中搜索报错信息Fail to connect to,可以快速定位到报错的源码,如下:

打印的e根据报错信息,可以确定是这里:

ReconnectTimerTask,从名子就可以看出来:是重连的定时任务,所以,如果想不让它不报错,就需要看看是否可以不启动这个定时器,这样自然就不会打印ERROR了,是这个逻辑吧?
OK,那我们得先找到启动定时器的地方,怎么找?
对,先查找一下ReconnectTimerTask的类的引用,很快就定位到了HeaderExchangeClient.startReconnectTask(URL url)方法,看名子就知道:开始重连任务。

OK,到这我不说你应该也发现了,这里有个if判断条件shouldReconnect(url)方法,和第一个问题的shouldCheck都是统一命名规则,想都不用想,可以肯定就在这里控制它!
我们看一下,代码就一行,url.getParameter内部是从Map中查找reconnect,找不到默认会设为true:
String RECONNECT_KEY = "reconnect";
private boolean shouldReconnect(URL url) {return url.getParameter(Constants.RECONNECT_KEY, true);
}
那么问题来了, reconnect参数在哪配置?
这里向上查找引用的话,链路有点深,所以为了看的更清晰,我们可以打个断点,看下调用堆栈。
这样,一下就找到了入口:ReferenceConfig.get方法,这里代码更少,主要就是调用init()方法。

转到init()方法的313行,传入的正是一个map,如下图,调试发现里面竟然有check=false,所以猜测还是与ConsumerConfig(消费者配置类)有关,方里里再向上找一找,还真找到了ConsumerConfig类的对象consumer,从名子appendParameters就知道它是往map里追加consumer的配置!所以就这样配置上了!

所以我们在dubbo.consumer下面配一下试试,
- application.properties
dubbo.consumer.reconnect = false
不出所料,生效了!如下图

4. 补充说明
综上,配置dubbo.consumer.reconnect = false 就代表消费方不重连提供方!
实际上,这里有一个机制,就是Dubbo的重连机制,也是为了能及早发现问题,所以生产环境建议不要修改此配置!
而这个配置多用于开发环境,用于忽略不关心的服务!
那么,对于关心的服务,需要调用的话,怎么做?
可以考虑以下两种做法:
- 做法1. 对网络不通的环境,进行服务隔离
可以通过配置Nacos服务发现group隔离服务注册,例如:
spring.cloud.nacos.discovery.group=XXX_GROUP
这样,就可以做到本地环境只调本地服务,DEV环境只调DEV服务,只需要配置相同组名即可!
- 做法2. 不做服务隔离,在实际调用失败后,做容错处理
因为调用链路可能会错综复杂,有时环境隔离成本太高,这时就可以转为HTTP请求,对Nginx或Gateway发起HTTP调用,这也是对上述两种场景RPC调用异常的兜底方案!
总结
Java的开源框架,我们有时可以不用跟的太深,一样可以快速搞定一些问题!
- 搜索报错文本,定位源码位置
- 通过查找引用、打断点找入口,分析是什么原因导致走到报错位置
- 通过名子或注释了解方法的意图,通过主流程快速找出解决问题的关键点
最后
虽然框架源码一直在变,但方法万变不离其宗,套路都是相通的,你更值得学习的是排查问题的方法,更重要的是养成独立解决问题的习惯,相信你可以做到!
如果你学会了排查问题的方法,那么你以后就会很独立,也会被你的领导和同事看到你有两把刷子,说不准还能成为疑难杂症专家!即使你在遇到难题问了师傅,他也会觉得你问的有水平,他也会为帮你解决这个问题,漏了一手而沾沾自喜!
所以,遇到问题不是坏事, 多解决问题,问题会让你的经验越来越丰富,也会让你对吃饭的框架越来越熟悉,这些都是你的财富,也可以写进简历让面试官更喜欢你。不过友情提醒,尺度把控好,项目中遇到问题切勿死磕,切勿陷入细节影响项目进度!

那么对于Dubbo RPC调用异常转HTTP调用,你知道怎么实现吗?这也是我计划将在本专栏下文分享的内容,如果感觉不错,欢迎订阅本专栏,后面还有更多的【Spring Cloud Alibaba】实战知识陆续放出。
关注我 天罡gg 分享更多干货: https://blog.csdn.net/scm_2008
大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下文见!
相关文章:
【Spring Cloud Alibaba】(五)Dubbo启动报错?一直重连报错?你值得学习的是排查问题的方法
系列目录 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】(二)微服务调用组件Feign原理实战 【Spring Cloud Alibaba】(三)OpenFeign扩展点实战 源码详解 【Spri…...
adb命令的使用
命令 连接机顶盒 adb connect [机顶盒ip]查看已连接设备 adb devices断开某个机顶盒的连接 adb disconnect [机顶盒ip] or adb disconnect [虚拟机名称]断开所有设备连接 adb disconnect获取 root 权限 adb root挂载文件系统 adb remount当想往移动设备端 push 文件时显…...
springBoot自定义参数类型转换器
springBoot允许用户自定义转换器,以处理自定义请求参数协议。 方式一:通过实现接口:WebMvcConfigurer 并重写方法的形式。 Configuration public class BootConfig implements WebMvcConfigurer {/*** 自定义参数转换*/Overridepublic voi…...
OA系统在企业中的应用你知道哪些?
随着人工智能技术的不断发展,企业中的OA系统(Office Automation System)正在逐渐得到广泛应用。OA系统是一种集成了多种功能的信息化工具,能够帮助企业实现办公自动化、信息管理、决策支持等多种功能。本文将从OA系统在企业中的应…...
JAVA中,ArrayList 的扩容机制,含案例
JAVA中,ArrayList 的扩容机制,含案例 在 Java 中,ArrayList 是一个动态数组,它可以根据需要自动增长。当 ArrayList 中的元素数量超过其初始容量时,它会重新分配一个更大的内部数组,然后将现有元素复制到新…...
供应链的有效管理,分析指标有哪些
对于企业而言,供应链是一个很复杂的、体系化的生态系统,从原材料、到供应商、到生产、仓库、物流,最后到达经销商或者最终客户那里,这个链条很长。相关的分析指标也有很多,在这些指标里面也有非常多可以扩展、延申的内…...
嵌入式环境配置—VMware 软件安装和虚拟机的创建
目录 一、VMware软件的安装 二、虚拟机的创建 三、Linux操作系统的安装 VMware软件的安装 为什么要虚拟机? 嵌入式Linux开发需要在Linux系统下进行,我们选择了Ubuntu。 1.双系统安装 有问题,一次只能使用一个系统。Ubuntu基本只做编译用。需求&…...
阿里前端二面经典手写面试题汇总
实现类的继承 实现类的继承-简版 类的继承在几年前是重点内容,有n种继承方式各有优劣,es6普及后越来越不重要,那么多种写法有点『回字有四样写法』的意思,如果还想深入理解的去看红宝书即可,我们目前只实现一种最理想…...
【Eye】Fake News Reading on Social Media: An Eye-tracking Study
Fake News Reading on Social Media: An Eye-tracking Study Abstract 在网上传播假新闻(以及一般的虚假信息)最近被认为是威胁整个社会的一个主要问题。这种传播在很大程度上是由于新的媒体形式,即社交网络和在线媒体网站。研究人员和从业…...
想学计算机,应该学什么专业?
我们在考虑想学计算机,应该学什么专业?这个问题的时候,每个人都应该结合自己的兴趣来确定。有的喜欢编程、有的喜欢设计、有的喜欢做产品跟人打交道……自己有兴趣再加上自己的努力,掌握好专业技能,就一定能进入高薪的…...
Android逆向之旅—反编译利器Apktool使用教程
apktool下载软件首先下载apktool.bat和apktool.jar官网地址:https://ibotpeaches.github.io/Apktool/install/配置环境变量具体的apktool命令自行百度apktool 解包与打包解包: apktool d xxx.apk打包: apktool b xxx1.jadx安装与使用下载exe或…...
色环电阻的阻值如何识别
这种是色环电阻,其外表有一圈圈不同颜色的色环,现在在一些电器和电源电路中还有使用。下面的两种色环电阻它颜色还不一样,一个蓝色,一个土黄色,其实这个蓝色的属于金属膜色环电阻,外表涂的是一层金属膜&…...
Dataway 让 Spring Boot 不再需要 Controller、Service、DAO、Mapper 简单接口直接开发。
新的sql语法可以先看一下官网,部署起来之后会用到Dataql: DataQL - 数据查询语言https://www.dataql.net/先看一下效果 接下来来实现一下。 1 创建spring boot项目 导入依赖 <!--begin dataWay--><!--hasor-spring 负责 Spring 和 Hasor 框架之…...
C#窗口介绍
窗口就是打开程序我们所面对的一个面板,里面可以添加各种控件,如下图所示,我们可以在属性栏设置其标题名称、图标、大小等。图1 窗口图 图2 设置面板 图3 设置双击标题框,会生成Load函数,也可以到事件里面去找Load函数…...
SpringBoot:SpringBoot整合Junit 和 MyBatis(3)
SpringBoot整合Junit 和 MyBatis1. SpringBoot整合Junit2. SpringBoot整合MyBatis2.1 定义SpringBoot项目2.2 定义dao接口2.3 定义service层2.4 定义controller层2.5 配置yml/yaml文件2.6 postman测试1. SpringBoot整合Junit 在com.example.service下创建BookService接口 publ…...
Web自动化测试框架Selenium
作者:霍格沃兹测试开发学社 链接:https://www.zhihu.com/question/59854292/answer/2827875817 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 什么是自动化测试 自动化测试就是࿰…...
大数据系统自检
第一章 大数据计算系统概述 1.1 大数据计算框架概述 Hadoop Hadoop的运行过程(5个步骤?) split > map > shuffle > reduce > output Hadoop的详细运行过程?(4个大过程,6662) 创建…...
MySQL数据库操作
查看数据库语法show databases——列出所有的数据库 show databases [ like wild ];——列出和字符串wild名字相同的数据库 这里可以配合SQl的 "%" 和 "_" 通配符使用来查找多个数据库在SQL语句中"%"代表任意字符出现任意次数,"_"代表…...
线程安全实例分析
一、变量的线程安全分析 成员变量和静态变量是否线程安全? ● 如果它们没有共享,则线程安全 ● 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况 —— 如果只有读操作,则线程安全 —— 如果有读写操作&am…...
Tomcat源码分析-启动分析(二) Catalina初始化
Bootstrap Tomcat运行是通过Bootstrap的main方法,在开发工具中,我们只需要运行Bootstrap的main方法,便可以启动tomcat进行代码调试和分析。Bootstrap是tomcat的入口,它会完成初始化ClassLoader,实例化Catalina以及loa…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
