Dubbo服务降级

article/2025/8/28 2:55:34

dubbo降级服务

使用dubbo在进行服务调用时,可能由于各种原因(服务器宕机/网络超时/并发数太高等),调用中就会出现RpcException,调用失败。

服务降级就是指在由于非业务异常导致的服务不可用时(上面举得例子),可以返回默认值,避免异常影响主业务的处理。

官方 dubbo 3.0-给出的服务降级

RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));

dubbo服务降级配置

mock 配置方式

dubbo官方文档上使用一个mock配置实现服务降级。mock只在出现非业务异常(比如超时,网络异常等)时执行。

mock的配置支持两种:

  1. 方案一:则是配置”return null”,可以很简单的忽略掉异常。
  2. 方案二:为boolean值,默认的为false。如果配置为true,则缺省使用mock类名,即类名+Mock后缀;

mock配置在调用方,服务降级不需要对服务方配置产生修改。下面举个例子说明

方案一

服务提供方接口:

/**接口定义*/
public interface FooService {? ? public void doSomething1();? ? public String doSomething2(String str);}/**实现类*/
public class FooServiceImpl implements FooService {? ? public void doSomething1() {
? ? ? ? System.out.println("service invoke: doSomething1");
? ? }? ? public String doSomething2(String str) {
? ? ? ? System.out.println("service invoke: doSomething2 ," + str);
? ? ? ? return "service invoke: doSomething2";
? ? }
}

服务提供方dubbo.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
? ? xsi:schemaLocation="http://www.springframework.org/schema/beans ? ? ? ?http://www.springframework.org/schema/beans/spring-beans.xsd ? ? ? ?http://code.alibabatech.com/schema/dubbo ? ? ? ?http://code.alibabatech.com/schema/dubbo/dubbo.xsd">? ? <!-- 提供方应用信息,用于计算依赖关系 -->
? ? <dubbo:application name="hello-world-app" />? ? <!-- 使用multicast广播注册中心暴露服务地址 -->
? ? <dubbo:registry address="zookeeper://127.0.0.1:2181" />? ? <!-- 用dubbo协议在20880端口暴露服务 -->
? ? <dubbo:protocol name="dubbo" port="20880" />? ? <!-- 声明需要暴露的服务接口 -->
? ? <dubbo:service interface="com.test.service.FooService" ref="fooServerImpl" timeout="10000" />? ? <!-- 和本地bean一样实现服务 -->
? ? <bean id="fooServerImpl" class="com.test.serviceimpl.FooServerImpl" /></beans>

服务调用方dubbo.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
? ? xsi:schemaLocation="http://www.springframework.org/schema/beans ? ? ? ?http://www.springframework.org/schema/beans/spring-beans.xsd ? ? ? ?http://code.alibabatech.com/schema/dubbo ? ? ? ?http://code.alibabatech.com/schema/dubbo/dubbo.xsd">? ? <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
? ? <dubbo:application name="dubbo-consumer" ?/>? ? <dubbo:registry address="zookeeper://127.0.0.1:2181" />? ? <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
? ? <dubbo:reference id="fooService" interface="com.test.service.FooService" ?timeout="10000" check="false" mock="return null">
? ? </dubbo:reference></beans>

测试在调用端调用服务两个方法,当服务端正常启动时,程序获得正常返回值;当服务提供方没有启动(模拟服务不可用状态),调用方依然正常运行,调用doSomething2获取返回值时null。

方案二

mock实现接口方式

上面在**dubbuo:reference 中配置mock=“retrun null” 的配置**,在服务降级时会对service中的所有方法做统一处理,即都返回null。但是有的时候我们需要一些方法在服务不可用时告诉我们一些其他信息,以便做其他处理。如更新/删除等。要有较好的区分,可以通过以下的方式。

业务接口所在的包中,定义一个类,该类的命名需要满足以下规则:业务接口简单类名 + Mock同时实现mock接口,类名要注意命名规范:接口名+Mock后缀。此时如果调用失败会调用Mock实现。mock实现需要****保证有无参的构造方法。
配置mock=”true”的情况,对于上面的例子即在FooService的同个路径下,添加类FooServiceMock,实现如下:

public class FooServiceMock implements FooService {
? ? public void doSomething1() {
? ? ? ? throw new RuntimeException("fail!");
? ? }? ? public String doSomething2(String str) {
? ? ? ? return null;
? ? }
}

然后修改消费者的dubbo.xml

 <dubbo:reference id="fooService" interface="com.test.service.FooService" ?timeout="10000" check="false" mock="true">

dubbo服务降级具体实现

通过Dubbo的Filter对Dubbo进行扩展,从而使得每次服务发起调用都可以得到监控,从而可以监控每次服务的调用。

对自动判断服务提供端是否宕机:通过一个记录器对每个方法出现RPC异常进行记录,并且可以配置在某个时间段内连续出现都少个异常可判定为服务提供端出现了宕机,从而进行服务降级。

自动恢复远程服务调用:通过配置检查服务的频率来达到定时检查远程服务是否可用,从而去除服务降级。

判断降级相关配置
降级配置分配为应用级别,接口级别,方法级别 。dubbo相关参数配置在dubbo.properties中,默认是在classpath根目录,也可以通过-Ddubbo.properties.file来指定该文件路径。

应用级别

dubbo.reference.default.break.limit:该参数是配置一个方法在指定时间内出现多少个异常则判断为服务提供方宕机
dubbo.reference.default.retry.frequency:该参数配置重试频率,比如配置100,则表示没出现一百次异常则尝试一下远程服务是否可用
dubbo.reference.circuit.break:服务降级功能开关,默认是false,表示关闭状态,可以配置为true

接口级别

dubbo.reference.fullinterfacename.break.limit:同上面dubbo.reference.defaultbreaklimit,指定某个接口dubbo.reference.fullinterfacename.break.limit:同上面dubbo.reference.defaultbreaklimit,指定某个接口dubbo.reference.{fullinterfacename}.retry.frequency:同上面
dubbo.reference.${fullinterfacename}.circuit.break:服务降级功能开关,默认是false,表示关闭状态,可以配置为true

方法级别

dubbo.reference.fullinterfacename.fullinterfacename.{methodName}.break.limit:同上面dubbo.reference.default-break-limit,指定某个接口的某个方法
dubbo.reference.fullinterfacename.fullinterfacename.{methodName}.retry.frequency:同上面dubbo.reference.default-retry-frequency,指定某个接口的某个方法
dubbo.reference.fullinterfacename.fullinterfacename.{methodName}.circuit.break:服务降级功能开关,默认是false,表示关闭状态,可以配置为true


http://chatgpt.dhexx.cn/article/r0Tut3fK.shtml

相关文章

降级限流

目录 1、限流和降级 1.1、降级 1.2、限流 2、限流算法 2.1、滑动窗口 2.2、漏桶 2.3、令牌桶 3、限流实践 3.1、单机Guava实现令牌桶和漏桶 3.2、分布式限流器实现 3.2.1、Redis实现 3.2.2、lua脚本实现 3.2.3、Redission的实现 4、小结 前言 对于高可用的服务&#xff0c;除了…

服务降级设计

实际系统运维中会出现某点的流量高峰&#xff0c;该时间有些可以预计&#xff0c;如双十一&#xff0c;有些不能预计&#xff0c;如某明星大爆料 等等&#xff0c;那么对着此类情况加设备等不能满足要求或者不能立刻满足邀请的时候&#xff0c;就需要对服务进行降级操作。

mysql数据库自动降级_mysql降级caveats

在线QQ客服:1922638 专业的SQL Server、MySQL数据库同步软件 在此博客中,我们将讨论在MySQL降级期间需要注意的事项。 之前,我曾写过博客MySQL升级最佳实践。除了升级MySQL版本外,有时还需要降级。在降级MySQL时,支持两种降级方法: 就地降级:在这种方法中,您使用现有的数…

Dubbo使用之服务降级

什么是服务降级 降级的目的是为了保证核心服务可用。 降级可以有几个层面的分类&#xff1a; 自动降级和人工降级&#xff1b; 按照功能可以分为&#xff1a;读服务降级和写服务降级 对一些非核心服务进行人工降级&#xff0c;在大促之前通过降级开关关闭哪些推荐内容、评价…

伪代码格式和标准

目录 注意算法组成部分算法示例 注意 每一条指令占一行(else if例外)&#xff0c;指令后不跟任何符号&#xff08;Pascal和C中语句要以分号结尾&#xff09;每一行要标号开头描述输入&#xff0c;输出变量名和保留字不区分大小写&#xff0c;Pascal相同&#xff0c;C或C不同数…

LaTeX伪代码写法总结

1. 伪代码所用包 一般会接触到的包有algorithm、algorithmic、algorithmicx、algorithm2e这四种包。 algorithm用于给伪代码提供一个浮动体环境&#xff0c;防止其换页或其他因素导致的内容中断&#xff0c;从而跨页显示。 algorithmic用于编辑伪代码的内容&#xff0c;一些…

伪码-伪代码的定义以及实现

伪代码的写法 伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal&#xff0c;C&#xff0c;Java&#xff0c;etc)实现。因此&#xff0c;伪代码必须结构清晰、代码简单、可读性好&#xff0c;并且类似自然语言…

伪代码教程

伪代码教程 起一篇伪代码基础教程 伪代码(Pseudo code)是一种介于计算机语言和自然语言间的文字和符号&#xff0c;是表达算法的简单而有效的方法。伪代码不需要关注底层是如何实现的&#xff0c;本身就是算法框架的逻辑模型。 一、赋值语句 赋值号 A ← B A\leftarrow B A←…

伪代码怎么编写?

20230522 补充一下&#xff1a; 建议学习PUML的语法&#xff0c;这个和伪代码很相似&#xff0c;也可以看到业务流程图 问 根据IDEA项目代码生成伪代码的工具 答 目前没有根据IDEA项目代码自动生成伪代码的工具。伪代码是一种描述程序算法的语言&#xff0c;通常不是具体的编…

【笔记】伪代码编写

在线LaTeX编写工具overleaf极大的方便了暂时需要为论文编写伪代码的需要&#xff1a;Overleaf, Online LaTeX Editor 该工具只需要简单注册就可以使用。 首先进入overleaf主页&#xff0c;然后完成注册和登录&#xff1a; 接着&#xff0c;需要创建用于储存LaTeX的文件夹&…

伪代码与代码区别

伪码&#xff08;Pseudocode&#xff09;是一种算法描述语言。使用伪码的目的是使被描述的算法可以容易地以任何一种编程语言&#xff08;Pascal&#xff0c;C&#xff0c;Java等&#xff09;实现。因此&#xff0c;伪代码必须结构清晰、代码简单、可读性好&#xff0c;并且类似…

伪代码书写方式

伪代码是描述算法过程的一种语言&#xff0c;它可以直接用中文或者英文等自然语言表示&#xff0c;也可以直接上代码&#xff0c;但常用经典的语法表示(讲的就是这种)。日常生中,别人能通过你的描述明白相应算法就行。 小规范 1、不需要声明变量&#xff0c;变量名可以一定程…

伪代码学习与应用

目录 0. 前言1. 伪代码的基础语法2. 在word中插入伪代码2.1 Aurora和Miktex安装2.2 插入伪代码 参考链接伪代码模板模板一模板二模板三模板四 疑难杂症1. 显示中文&#xff1f;2. 特殊字符&#xff1f;3. 换行&#xff1f; 0. 前言 上一次接触伪代码可能还是在现代数字信号处理…

2D激光slam四种算法建图效果对比

slam算法对照 通过麦克纳姆轮机器人小车构建地图对比Gmapping、Hector、Karto、Cartographer四种算法的优缺点 真实场景图如下图所示&#xff1a; 具体步骤为&#xff1a; 1、打开地图构建命令 roslaunch turn_on_wheeltec_robot mapping.launch2、打开rviz rviz3、打开控制…

SLAM——hector-slam算法原理解析

1、hector-slam代码框架概述 下载源码&#xff1a;git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam.git 原理解读参照&#xff1a;https://blog.csdn.net/weixin_40047925/article/details/80679496 其中包含了许多用于仿真的文件&#xff0c;hector slam算法主…

激光SLAM算法学习(三)——3D激光SLAM

3D激光SLAM 1、3D激光SLAM的介绍 3D激光SLAM的输入: IMU数据 3D激光雷达数据 里程计数据 3D激光SLAM的输出: 3D点云地图 机器人的轨迹 or PoseGraph 2、3D激光SLAM的发展 3D激光SLAM的帧间匹配方法——点云配准算法 Point-to-Plane ICP Feature-based Method 3D激光SLAM的回…

SLAM 算法的一些简单的介绍和理解,有的是从别的地方找到的资料,感觉很有道理。

SLAM&#xff08;Simultaneous localization and mapping&#xff09;,我们要达到的目的就是估计机器人&#xff08;传感器-比如相机&#xff09;的位置轨迹&#xff0c;然后创建地图。locating和map两者互相依赖&#xff0c;密不可分。然而我们 已知的信息一个是 observation&…

2021年开源SLAM算法

1.TANDEM&#xff1a;Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo 慕尼黑工业大学Daniel Cremers团队&#xff0c;实时单目跟踪稠密建图纯视觉SLAM&#xff0c;采用Realsense D455(深度传感器IMU&#xff0c;但只用RGB) 项目地址&#xff1a;https…

激光SLAM技术总结(3)3D激光SLAM算法原理

目录 1. 3D激光SLAM简介 2. 3D激光雷达SLAM 3. 高精度V-LOAM方案 4 发展趋势 1. 3D激光SLAM简介 在 3D 激光 SLAM 领域中&#xff0c; 由 Zhang J 等人提出的LOAM 方案&#xff0c;利用 3D 激光雷达采集数据&#xff0c; 进行基于特征点的扫描匹配&#xff0c; 利用非线性…

实习:slam算法的学习整理

1.odom 2.updata_odom 3.updata_laser updata_landmark 4.resample pf.c 相机的位姿转换是基于世界坐标系的&#xff0c;观察到的路标也会在世界坐标系中不断收敛&#xff0c;若不是计算错误&#xff0c;基本上不会产生漂移。而IMU是自身坐标系标定的&#xff0c;在转换到…