Dubbo服务降级

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo服务降级 的相关文章

  • MyBatis 深入浅出

    一 MyBatis 基础 1 什么是MyBatis mybatis是一个持久层框架 用java编写的 它封装了jdbc操作的很多细节 使开发者只需要关注sql语句本身 而无需关注注册驱动 创建连接等繁杂过程 它使用了ORM思想实现了结果集的
  • 服务超时、重试次数、熔断如何设置

    文章目录 一 超时时间 为什么要设置超时时间 超时时间怎么设置 二 重试次数怎么设置 三 熔断 工作流程 一 超时时间 为什么要设置超时时间 针对服务调用都要设置一个超时时间 以避免依赖的服务迟迟没有返回调用结果 把服务消费者拖死 超时时间
  • 关于火绒邮件监控引起的扫描任意IP会有25和110端口反馈

    之前测试过公司的外网IP 因为之前一直很注意对外映射的端口 都限制了可以访问的IP地址和端口 所以之前扫描的时候是一个端口都扫描不出来的 最近闲的无事 想着再扫描试试 结果发现居然开放了25和110端口 我当时第一反应 我靠 不会有人已经黑
  • Spring Cloud 与 Dubbo 区别

    1 定位点不同 SpringCloud SpirngCloud 定位为微服务架构下的一站式解决方案 Dubbo 关注点主要在于服务的调用 流量分发 流量监控和熔断 2 dubbo基于rpc 底层netty SpirngCloud基于http
  • 【六袆 - Dubbo】Dubbo服务的简单调用;

    这里写目录标题 1 Dubbo服务的基本调用过程 1 1在Java中定义dubbo服务 以interface接口的方式 1 2 Provider提供服务的具体实现 并声明为dubbo服务 1 3 Consumer使用dubbo服务 1 Du
  • duboo使用zookeeper连接的单机及集群配置方式

    1 单机配置
  • MQ--6 Message queuing)>>>>微服务与dubbo以及Nexus

    MQ 1 Message queuing gt gt gt gt RabbitMQ MQ 2 Message queuing gt gt gt gt ZooKeeper MQ 3 Message queuing gt gt gt gt ka
  • 【Dubbo】Dubbo(一)为什么使用Dubbo?

    Dubbo Dubbo是一款Java RPC框架 如何将应用打包并部署到服务器上 之前的单一应用架构 可以部署到多个服务器上 每次修改或扩展某一处功能都要将整个应用重新打包并部署到多台服务器上 协同开发时都改这一个应用 不利于开发与维护 当
  • zookeeper看这一篇就够了

    第一章 zookeeper简介 第1节 zookeeper的由来 1 2 3 4 1 zookeeper最早起源于雅虎研究院的一个研究小组 2 在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调 并且这个系统还有单点问题 3
  • RPC实践(四)Dubbo实践

    Dubbo是一款重要的RPC框架 它是Alibaba开源的分布式服务框架 它主要特点 提供了注册中心来进行服务的管理 支持zookeeper redis等方式来实现注册中心 Dubbo按照分层的方式来架构 使用这种方式可以使各个层之间解耦合
  • tcc分布式事务源码解析系列(一)之项目结构

    happylifeplat tcc 是什么 有什么功能 这是碧桂园旺生活解决分布式事务的TCC开源方案 github地址 支持dubbo springcloud等rpc框架进行分布式事务 本地事务存储 支持redis mogondb zoo
  • Dubbo源码解析:服务暴露与发现

    dubbo源码解析 服务暴露与发现 概述 dubbo是一个简单易用的RPC框架 通过简单的提供者 消费者配置就能完成无感的网络调用 那么在dubbo中是如何将提供者的服务暴露出去 消费者又是如何获取到提供者相关信息的呢 这就是本章我们要讨论
  • fasterxml ToStringSerializerBase报错

    ToStringSerializerBase报错 报错内容 整合dubbo时报错 Caused by java lang NoClassDefFoundError com fasterxml jackson databind ser std
  • Thrift、Dubbo、Spring Cloud 和 gRPC

    何为RPC RPC Remote Procedure Call 远程过程调用 是一种进程间通信方式 是一种技术的思想 而不是规范 它允许程序调用另一个地址空间 通常是共享网络的另一台机器上 的过程或函数 而不用程序员显式编码这个远程调用的细
  • Dubbo 动态代理策略有哪些?

    Dubbo 是一个高性能 轻量级的 Java RPC 框架 它支持多种动态代理策略 以下是 Dubbo 支持的一些动态代理策略 JDK动态代理 这是 Java 动态代理的基础 通过代理接口生成代理类 当调用远程服务时 Dubbo 会根据接口
  • Dubbo怎么实现动态感知服务下线的呢?

    Dubbo是一个高性能 轻量级的开源Java RPC框架 用于服务间的远程通信 为了实现动态感知服务下线 Dubbo提供了多种策略 服务监控 Dubbo提供了内置的监控功能 通过在服务提供者上配置监控信息 可以实时监测服务状态 当服务下线时
  • Dubbo 容错策略

    Dubbo 是一款高性能 轻量级的开源 Java RPC 框架 它提供了多种容错策略以应对网络通信过程中的各种异常情况 以下是 Dubbo 的一些常见容错策略 Failover 失败自动切换 当服务调用失败时 自动切换到其他可用的服务提供者
  • Dubbo怎么实现动态感知服务下线的呢?

    Dubbo是一个高性能 轻量级的开源Java RPC框架 用于服务间的远程通信 为了实现动态感知服务下线 Dubbo提供了多种策略 服务监控 Dubbo提供了内置的监控功能 通过在服务提供者上配置监控信息 可以实时监测服务状态 当服务下线时
  • HttpRunner(20):脚手架工具使用(一键搭建)-httprunner运行方式

    脚手架工具使用 每一个成熟的系统工具 都会有对应的脚手架工具 它可以快速构建项目的必要目录 不必自己一个一个的配置与搭建 只需要执行一些命令即可 httprunner也提供了脚手架工具 使用步骤如下 1 在命令模式下输入hrun start
  • HttpRunner(22):httprunner设置代理及请求证书验证

    httprunner设置代理 httprunner 库本身没有提供设置代理的接口 但是底层使用了urllib requests 等库 可以设置HTTP PROXY 和HTTPS PROXY 环境变量 常用的网络库会自动识别这些环境变量 日常

随机推荐

  • python循环性能pk

    python循环性能pk 在任何一种编程语言中 xff0c 循环都是非常消耗时间的操作 假设任意一种简单的单步操作耗费的时间是1个单位 xff0c 将此操作重复执行上万次 xff0c 最终耗费的时间也将增长上万倍 众所周知 xff0c py
  • Java程序员必读的入门&进阶书单

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img lZRiIYGZ 1659350372441 http static chayuqing com edddeb70713efa2da69e953240a5b3ab
  • Java程序员怎样进阶

    对于很多学习Java的程序员来说 xff0c 回过头来看入门Java的过程并不难 xff0c 反而是学到后期感觉没有进步 xff0c 尤其是对于一个进军编程界的两三年的Java程序员来说 xff0c 工作如果还只是增删改查 xff0c 这可
  • java程序员该如何进阶?这份java中高级核心知识全面解析请收好

    Java中高级核心知识全面解析 是整理收录GitHub50K 43 Star以上的高质量学习文档 xff0c 前前后后花了近半个月的时间 xff0c 终于整理而成 包含了Java基础 网络 Linux 数据结构与算法 数据库 系统设计 工具
  • MySQL的 DDL和DML和DQL的基本语法

    前言 SQL语句 xff0c 即结构化查询语言 Structured Query Language xff0c 是一种特殊目的的编程语言 xff0c 是一种数据库查询和程序设计语言 xff0c 用于存取数据以及查询 更新和管理关系数据库系统
  • MySQL的10种常用数据类型

    MySQL的数据类型 常用的数据类型有 xff1a 整型 xff08 xxxint xff09 位类型 bit 浮点型 xff08 float和double real xff09 定点数 xff08 decimal numeric xff0
  • MySQL的DATE_FORMAT()函数将Date转为字符串

    一 前言 最近要做一些报表 xff0c 其中有一个创建报表的时间 xff0c 需要以固定的格式输出 xff1b 那么在SQL层面如何处理呢 xff1f 二 DATE FORMAT 函数 要将日期值格式化为特定格式 xff0c 可以使用DAT
  • MySQL的on duplicate key update 的使用

    mysql的存在就更新不存在就插入实现 先建数据库表 xff0c 重点要添加主键索引 xff08 id列 xff0c 没有测试 xff09 和唯一索引 xff08 branch no列 xff09 xff0c 随便找表测试 INSERT I
  • MySQL的Replace用法详解

    replace into平时在开发中很少用到 xff0c 这次是因为在做一个生成分布式ID的开源项目 xff0c 调研雅虎推出的一个基于数据库生成唯一id生成方案 xff1a flickr 碰到的一个知识盲点 xff0c 仅以此篇记录一下
  • springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存(超级详细)

    作者 xff1a bug菌 博客 xff1a CSDN 掘金等 公众号 xff1a 猿圈奇妙屋 特别声明 xff1a 原创不易 xff0c 转载请附上原文出处链接和本文声明 xff0c 谢谢配合 版权声明 xff1a 文章里可能部分文字或者
  • SpringBoot之异步方法

    1 Future Future代表异步计算的结果 提供了检查计算是否完成 等待其完成以及检索计算结果的方法 只有在计算完成后 xff0c 才能使用方法get检索结果 xff0c 如有必要 xff0c 将其阻塞 xff0c 直到准备就绪 取消
  • 8大基本数据类型:

    整数 xff1a byte IO流 文件输入输出 文件上传下载 数据保存硬盘 short 基本没卵用 int 大部分的整数 年龄 工作年限 long 比int大 浮点型 xff08 小数 xff09 xff1a float 基本没卵用 do
  • SpringBoot之自动装配原理

    1 自动装配的使用 Spring Boot的核心理念是简化Spring应用的搭建和开发过程 xff0c 提出了约定大于配置和自动装配的思想 开发Spring项目通常要配置xml文件 xff0c 当项目变得复杂的时候 xff0c xml的配置
  • SpringBoot使用AOP记录接口操作日志

    前言 xff1a 我们项目中可能有这种需求 xff0c 每个人请求了哪些接口 xff1f 做了什么事情 xff1f 参数是什么 xff1f 重要的接口我们需要记录操作日志以便查找 操作日志和系统日志不一样 xff0c 操作日志必须要做到简单
  • 修改Tomcat默认访问根目录

    Tomcat安装后 xff0c Tomcat的主目录是webapps root目录 在conf文件夹下面找到server xml 配置文件打开 在 中间添加一行 docBase即为默认访问的文件夹名称 Tomcat默认访问目录就是webap
  • 吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人

    面试了一些人 xff0c 简历上都说自己熟悉 Spring Boot 或者说正在学习 Spring Boot xff0c 一问他们时 xff0c 都只停留在简单的使用阶段 xff0c 很多东西都不清楚 xff0c 也让我对面试者大失所望 下
  • 大数据技术之hadoop——(四)历史服务器+常用脚本

    文章目录 前言 一 配置历史服务器 二 日志聚集 三 集群的停止与启动 四 常用脚本 五 常用端口号 前言 上一篇我们已经将hadoop完全分布式集群搭建完毕 xff0c 这一篇则作为完全分布式集群的补全操作 一 配置历史服务器 为了查看程
  • 富士康Java开发面试题目

    int leapyear int y 计算润年 if y 40 amp amp y 100 61 0 y 61 100 amp amp y 4000 return 1 else return 0 int day calculate int
  • 手把手教程SpringCloud gateway 结合nacos实现路由转发

    1 使用IDEA创建spring项目 xff0c JDK1 8 xff0c 无需添加依赖 2 添加spring cloud gateway和nacos lt dependencyManagement gt lt dependencies g
  • Dubbo服务降级

    dubbo降级服务 使用dubbo在进行服务调用时 xff0c 可能由于各种原因 xff08 服务器宕机 网络超时 并发数太高等 xff09 xff0c 调用中就会出现RpcException xff0c 调用失败 服务降级就是指在由于非业