当前位置: 首页 > news >正文

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

CSDN成就一亿技术人

系列目录

【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的坑吗?

加一个小插曲,我想做一下调查:当你遇到技术问题时你会怎么做?

  1. 报错了没见过,管它三七二十一,网上直接搜,施展搜索大法~~~

    然后,网上各种文章鱼龙混杂,运气好直接解决,运气不好方法试个遍也没效果…

  2. 向同事请教,一次一次请教,倍感无奈…

  3. 对报错快速排查一下(运气好直接解决),不行再有针对性的查找资料,遇到难点再向同事(或CSDN大佬)请教。

本文就以这两个Dubbo常见问题入手,带你进入源码分析如何排查问题 !一起拉开有趣的程序人生,Let’s go!

Dubbo避坑指南


一、启动报错

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 service xxxInterfaceName. No provider available for the service xxxInterfaceName from the url xxxUrl to the consumer xxxLocalhost use dubbo version xxxVersion

例如,我未启动提供者,重现的报错截图如下:
Dubbo启动报错 Failed to check the status of the service

3. 排查问题

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

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

Dubbo shouldCheck()

没有几行代码,我想你能想到:

:isCheck() 没有配置,默认为null

:由于① 为null,所以主要看getConsumer()

:如果① 和②均没配置,第3步默认设为true,即检查是否可用!

所以,对于我们来说,主要可配置点在 getConsumer().isCheck() ,

ConsumerConfig类的isCheck()方法

public Boolean isCheck() {return check;
}

ConsumerConfig类,从名子可以看出来:消费者配置类.

稍微找一找就可以找到,在@EnableDubbo注解上有一个@EnableDubboConfig注解,里面注释写着:

Dubbo源码:@EnableDubbo

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

Dubbo源码:DubboConfigConfigurationRegistrar

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

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环境,重现的报错截图如下:

Dubbo报错:Fail to connect to HeaderExchangeClient

3. 排查问题

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

Dubbo源码搜索:Fail to connect to

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

Dubbo源码:doConnect抛出RemotingException

ReconnectTimerTask,从名子就可以看出来:是重连的定时任务,所以,如果想不让它不报错,就需要看看是否可以不启动这个定时器,这样自然就不会打印ERROR了,是这个逻辑吧?

OK,那我们得先找到启动定时器的地方,怎么找?

对,先查找一下ReconnectTimerTask的类的引用,很快就定位到了HeaderExchangeClient.startReconnectTask(URL url)方法,看名子就知道:开始重连任务

Dubbo源码:定位HeaderExchangeClient.startReconnectTask

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()方法。

Dubbo源码调试,找到ReferenceConfig.get入口

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

Dubbo源码:ReferenceConfig.init中分析map

所以我们在dubbo.consumer下面配一下试试,

  • application.properties
dubbo.consumer.reconnect = false

不出所料,生效了!如下图
Dubbo源码:reconnect配置生效

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的开源框架,我们有时可以不用跟的太深,一样可以快速搞定一些问题!

  • 搜索报错文本,定位源码位置
  • 通过查找引用、打断点找入口,分析是什么原因导致走到报错位置
  • 通过名子或注释了解方法的意图,通过主流程快速找出解决问题的关键点

最后

虽然框架源码一直在变,但方法万变不离其宗,套路都是相通的,你更值得学习的是排查问题的方法,更重要的是养成独立解决问题的习惯,相信你可以做到!

如果你学会了排查问题的方法,那么你以后就会很独立,也会被你的领导和同事看到你有两把刷子,说不准还能成为疑难杂症专家!即使你在遇到难题问了师傅,他也会觉得你问的有水平,他也会为帮你解决这个问题,漏了一手而沾沾自喜!

所以,遇到问题不是坏事, 多解决问题,问题会让你的经验越来越丰富,也会让你对吃饭的框架越来越熟悉,这些都是你的财富,也可以写进简历让面试官更喜欢你。不过友情提醒,尺度把控好,项目中遇到问题切勿死磕,切勿陷入细节影响项目进度!

img

那么对于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语法可以先看一下官网&#xff0c;部署起来之后会用到Dataql&#xff1a; DataQL - 数据查询语言https://www.dataql.net/先看一下效果 接下来来实现一下。 1 创建spring boot项目 导入依赖 <!--begin dataWay--><!--hasor-spring 负责 Spring 和 Hasor 框架之…...

C#窗口介绍

窗口就是打开程序我们所面对的一个面板&#xff0c;里面可以添加各种控件&#xff0c;如下图所示&#xff0c;我们可以在属性栏设置其标题名称、图标、大小等。图1 窗口图 图2 设置面板 图3 设置双击标题框&#xff0c;会生成Load函数&#xff0c;也可以到事件里面去找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

作者&#xff1a;霍格沃兹测试开发学社 链接&#xff1a;https://www.zhihu.com/question/59854292/answer/2827875817 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 什么是自动化测试 自动化测试就是&#xff0…...

大数据系统自检

第一章 大数据计算系统概述 1.1 大数据计算框架概述 Hadoop Hadoop的运行过程&#xff08;5个步骤&#xff1f;&#xff09; split > map > shuffle > reduce > output Hadoop的详细运行过程&#xff1f;&#xff08;4个大过程&#xff0c;6662&#xff09; 创建…...

MySQL数据库操作

查看数据库语法show databases——列出所有的数据库 show databases [ like wild ];——列出和字符串wild名字相同的数据库 这里可以配合SQl的 "%" 和 "_" 通配符使用来查找多个数据库在SQL语句中"%"代表任意字符出现任意次数,"_"代表…...

线程安全实例分析

一、变量的线程安全分析 成员变量和静态变量是否线程安全&#xff1f; ● 如果它们没有共享&#xff0c;则线程安全 ● 如果它们被共享了&#xff0c;根据它们的状态是否能够改变&#xff0c;又分两种情况 —— 如果只有读操作&#xff0c;则线程安全 —— 如果有读写操作&am…...

Tomcat源码分析-启动分析(二) Catalina初始化

Bootstrap Tomcat运行是通过Bootstrap的main方法&#xff0c;在开发工具中&#xff0c;我们只需要运行Bootstrap的main方法&#xff0c;便可以启动tomcat进行代码调试和分析。Bootstrap是tomcat的入口&#xff0c;它会完成初始化ClassLoader&#xff0c;实例化Catalina以及loa…...

基础复习第二十二天 泛型的使用

泛型JDK1.5设计了泛型的概念。泛型即为“类型参数”&#xff0c;这个类型参数在声明它的类、接口或方法中&#xff0c;代表未知的通用的类型。例如&#xff1a;java.lang.Comparable接口和java.util.Comparator接口&#xff0c;是用于对象比较大小的规范接口&#xff0c;这两个…...

【C++进阶】三、二叉搜索树

目录 一、二叉搜索树 1.1 概念 1.2 二叉搜索树操作 二、二叉搜索树实现 2.1 框架总览 2.2 实现接口总览 2.2.1 构造函数 2.2.2 拷贝构造 2.2.3 赋值重载 2.2.4 析构函数 2.2.5 二叉搜索树的遍历 2.2.6 插入函数 2.2.7 查找函数 2.2.8 删除函数 2.3 二叉搜索数完整…...

电脑系统崩溃怎么修复教程

系统崩溃了怎么办? 如今的软件是越来越复杂、越来越庞大。由系统本身造成的崩溃即使是最简单的操作&#xff0c;比如关闭系统或者是对BIOS进行升级都可能会对PC合操作系统造成一定的影响。下面一起来看看电脑系统崩溃修复方法步骤。 工具/原料&#xff1a; 系统版本&#xf…...

语义分割数据标注案例分析

语义分割&#xff08;Semantic Segmentation&#xff09;是计算机视觉领域中的一种重要任务&#xff0c;它的目的是将图像中的每个像素分配到对应的语义类别中。简单来说&#xff0c;就是将一张图像分割成多个区域&#xff0c;并为每个像素指定一个标签&#xff0c;标识出它属于…...

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(多指标评价)

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(多指标评价) 文章目录 回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(多指标评价)预测效果基本介绍程序设计参考资料预测效果 基本介绍 GRU神经网络是LST...

驱动程序开发:Buildroot根文件系统构建并加载驱动文件xxx.ko测试

目录一、buildroot根文件系统简介二、buildroot下载三、buildroot构建根文件系统1、配置 buildroot①配置 Target options②配置 Toolchain③配置 System configuration④配置 Filesystem images⑤禁止编译 Linux 内核和 uboot2、 buildroot 下的 busybox 配置①修改 Makefile&…...

R+VIC模型融合实践技术应用及未来气候变化模型预测

目录 理论专题一&#xff1a;VIC模型的原理及特点 综合案例一&#xff1a;基于QGIS的VIC模型建模 理论专题二&#xff1a;VIC模型率定验证 综合案例二&#xff1a;基于R语言VIC参数率定和优化 理论专题三&#xff1a;遥感技术与未来气候变化 综合案例三&#xff1a;运用V…...

第六章.决策树(Decision Tree)—ID3算法,C4.5算法

第六章.决策树(Decision Tree) 6.1 ID3算法,C4.5算法 1.决策树适用的数据类型 比较适合分析离散数据&#xff0c;如果是连续数据要先转换成离散数据再做分析 2.信息熵 1).概念&#xff1a; 一条信息的信息量大小和它的不确定性有直接的关系&#xff0c;要搞清楚一件非常不确…...

springboot+pgbouncer+postgres数据库连接池集成方案及问题解决

期望通过每一次分享&#xff0c;让技术的门槛变低&#xff0c;落地更容易。 —— around 前言 旨在解决微服务项目全是连接池并影响数据库并发连接&#xff0c;作者的环境是基于sprongboot微服务连接postgres数据库&#xff0c;每个微服务的DAO层配置都使用了连接池技术。后续…...

Mysql 常用日期处理函数

Mysql 常用日期处理函数 1 建表语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int(4) NOT NULL,ENAME varchar(10…...

孝义网站开发公司/5118关键词查询工具

目录 一、前言 二、图像像素操作 1、读像素 2、写像素 三、全部代码及结果展示 1、代码 2、运行效果图 一、前言 欠下的总是要还的&#xff0c;继续给大家更新有关于OpenCV的教程&#xff0c;我也不知道能不能保证每天一篇&#xff0c;有时候真的是时间不够&#xff0c…...

科郑州网站建设/重庆公司seo

「Jetpack - Lifecycle梳理」 本文已参与「新人创作礼」活动&#xff0c;一起开启掘金创作之路 一、写在前面 谷歌推出Jetpack系列已经有一段时间了&#xff0c;作为AAC(Android Architecture Components)架构组件基础&#xff0c;使开发的过程越来越规范化&#xff0c;遵循…...

西安十强互联网站建设公司/软文怎么写比较吸引人

目录 一、实验拓扑 二、实验步骤 三、实验过程 总结 实验难度2实验复杂度3一、实验拓扑 二、实验步骤 1.搭建如图所示的网络拓扑图&#xff1b; 2.初始化路由器设备&#xff0c;配置IP地址&#xff1b; 3.配置ASA的初始相关参数&#xff1a; 防火墙的名称为ASA 接口接…...

哪家做网站公司好/广州网络推广专员

原因&#xff1a;出现这个问题&#xff0c;可能有人move过表&#xff0c;或者disable 过索引。1、alter table xxxxxx move tablespace xxxxxxx 命令后&#xff0c;索引就会失效。2、alter index index_name unusable&#xff0c;命令使索引失效。 解决办法&#xff1a;1、重建…...

曲靖网站建设公司/企业网站设计服务

本文价值与收获 看完本文后,您将能够作出下面的界面 Toggle 切换开关 在打开和关闭状态之间切换的控件。 struct Toggle<Label> where Label : View使用方法 您可以通过提供isOn绑定和标签来创建切换。 将isOn绑定到一个布尔属性,该属性确定切换是打开还是关闭。 将…...

wordpress函数调用实例/电商培训课程

发现以前配好的java环境变量和tomcat环境变量全都清空了&#xff0c;在重新配置的时候总是出现问题&#xff0c;即在cmd命令窗口下&#xff0c;输入java&#xff0c;显示正常&#xff0c;输入java -version 也是显示正常&#xff0c;唯独输入javac&#xff0c;显示“javac不是内…...