实现dubbo服务降级

实现dubbo服务降级dubbo降级服务使用dubbo在进行服务调用时,可能由于各种原因(服务器宕机/网络超时/并发数太高等),调用中就会出现RpcException,调用失败。服务降级就是指在由于非业务异常导致的服务不可用时(上面举得例子),可以返回默认值,避免异常影响主业务的处理。dubbo服务降级配置mock配置方式dubbo官方文档上使用一个mock配置,实现服务降级。mock只在出现非业务异常(比如超时,网络

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

dubbo降级服务

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

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

dubbo服务降级配置

mock 配置方式

dubbo官方文档上使用一个mock配置,实现服务降级。mock只在出现非业务异常(比如超时,网络异常等)时执行。mock的配置支持两种,一种为boolean值,默认的为false。如果配置为true,则缺省使用mock类名,即类名+Mock后缀;另外一种则是配置”return null”,可以很简单的忽略掉异常。

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。但是有的时候我们需要一些方法在服务不可用时告诉我们一些其他信息,以便做其他处理。如更新/删除等。要有较好的区分,可以通过以下的方式。

  1. 配置mock="true" ,同时实现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服务降级具体实现

通过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}.retry.frequency:同上面
dubbo.reference.${fullinterfacename}.circuit.break:服务降级功能开关,默认是false,表示关闭状态,可以配置为true

方法级别

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

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135807.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 怎么新建pytest的ini文件_python读取配置文件

    怎么新建pytest的ini文件_python读取配置文件前言pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行查看pytest.ini的配置选项pytest-h找到以下

    2022年7月28日
  • PyCharm激活码永久有效PyCharm2021.2.4激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2021.2.4激活码教程-持续更新,一步到位PyCharm激活码永久有效2021.2.4激活码教程-Windows版永久激活-持续更新,Idea激活码2021.2.4成功激活

    2022年6月19日
  • 小程序全栈期末复习

    小程序全栈期末复习第1章作业一.单选题(共10题,100.0分)1以下哪个不是主流的手机操作系统?A、AndroidB、iOSC、WindowsPhoneD、Blackberry正确答案:D Blackberry是黑莓手机,是一种手机品牌,不是一种手机操作系统2微信小程序是于何时正式发布?A、2015年1月9日B、2016年1月9日C、2017年1月9日D、2018年1月9日正确答案:C是2017年1月9日正式发布,距离苹果第一代手机发布正好十年3以下哪个不是正确的小程序入口?

    2022年9月1日
  • malloc函数具体解释

    malloc函数具体解释

    2021年11月29日
  • WCF分布式事务(EF)

    WCF分布式事务(EF)

    2022年1月6日
  • eureka底层原理「建议收藏」

    eureka底层原理「建议收藏」什么是注册中心全称为:服务注册与发现,rpc远程调用框架核心思想,在于注册中心,使用注册中心管理每个服务与服务之间的依赖关系,这种关系被称为服务治理概念;任何rpc远程调用框架都至少有一个注册中心;服务注册将服务信息注册到注册中心,相当于告诉公司的人,我已经打卡上班了,可以分配工作任务给我了,比如现在我们有一个服务消费者服务A,和两个节点的服务提供者,服务B。服务A和服务B在启动的时候都会向注册中心进行服务注册。服务发现从注册中心获取已注册的服务信息,发现有哪些可以调用的服务可供我使用;相

    2022年10月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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