Dubbo服务降级

Dubbo服务降级dubbo降级服务使用dubbo在进行服务调用时,可能由于各种原因(服务器宕机/网络超时/并发数太高等),调用中就会出现RpcException,调用失败。服务降级就是指在由于非业务异常导致的服务不可用时(上面举得例子),可以返回默认值,避免异常影响主业务的处理。官方dubbo3.0-给出的服务降级RegistryFactoryregistryFactory=ExtensionLoader.getExtensionLoader(RegistryFactory.class)

大家好,又见面了,我是你们的朋友全栈君。

dubbo降级服务

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

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

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

Dubbo服务降级

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服务降级

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.default−break−limit,指定某个接口dubbo.reference.fullinterfacename.break.limit:同上面dubbo.reference.default−break−limit,指定某个接口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
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132155.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ssh命令带密码_ssh远程登录命令明文密码

    ssh命令带密码_ssh远程登录命令明文密码ssh命令带密码有时候,我们在写脚本的时候,我们ssh到一台客户机执行命令的时候,如果客户机设置了密码,这时候,就会提示我们需要通过交互式的方式输入密码。当我们不想执行这一步操作的时候,我们可以在ssh的同时带上密码,不用我们手动输入。先安装一个软件包yuminstall-ysshpass只需要在ssh命令的前面带上sshpass就可以了sshpass-p’redhat’s…

    2022年10月19日
  • 2022年化工自动化控制仪表考试模拟100题及答案详解_化工仪表及自动化答案

    2022年化工自动化控制仪表考试模拟100题及答案详解_化工仪表及自动化答案题库来源:安全生产模拟考试一点通公众号小程序2022化工自动化控制仪表上岗证题目系化工自动化控制仪表培训试题上机考试练习题!2022年化工自动化控制仪表考试模拟100题及答案根据化工自动化控制仪表考试大纲。化工自动化控制仪表判断题通过安全生产模拟考试一点通准确把握考试要点。1、【单选题】“硬水”是指水中所溶的()离子较多的水。(B)A、钙和钠B、钙和镁C、镁和铁2、【单选题】串级控制系统具有一定的自适应能力可用于负荷和操作条件有较大变化的场合,是由于增加了()。(B…

  • Jlink或者stlink用于SWD接口下载程序

    Jlink或者stlink用于SWD接口下载程序最近要使用stm32f103c8t6最小系统板,直接ISP串口下载程序太麻烦,就想着使用swd接口来调试。结果:通过SWD接口下载程序成功,但调试失败,还不知原因,会的的人麻烦交流一下。SWD接口:3.3VDIO(数据)CLK(时钟)GND1.首先声明jlink和stlink都有jtag和swd调试功能。jlink接口如下:如图,我使用的就是VCC…

  • elementui滚动条美化_vue element ui文档

    elementui滚动条美化_vue element ui文档vueelement滚动条颜色更改

  • php三个数从大到小排列_php常用的流程控制语句

    php三个数从大到小排列_php常用的流程控制语句<?php$a = rand(100,999);$b = rand(100,999);$c = rand(100,999);echo “a=”.”$a”.”<br>”;echo “b=”.”$b”.”<br>”;echo “c=”.”$c”.”<br>”;if(($a > $b ) && ($a > …

  • disk boot failure ,insert sysytem disk and press enter解决方法

    disk boot failure ,insert sysytem disk and press enter解决方法故障分析与处理从现象上看硬盘可能是损坏了,如果在无法启动前的最后一次关机是按照正常程序退出。将硬盘拆下来连接到另外一台机器上,开机启动后进入CMOS设置主菜单,选择“IDE HDD AUTO DETECTION”栏,检测到硬盘参数,能正常进入硬盘。将硬盘装回到原来的机器上,进入CMOS设置后能自动检测到硬盘的参数,恢复了正常启动。关机时按照正常程序退出,而下一次开机时无法用硬盘启动并且无

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号