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.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

dubbo服务降级(2)的更多相关文章

  1. Dubbo服务降级设置

    dubbo降级服务     dubbo开发中,通常是微服务架构,那么在使用过程中可能会遇到多种问题: 1)多个服务之间可能由于服务没有启动或者网络不通,调用中会出现远程调用失败; 2) 服务请求过大, ...

  2. dubbo服务降级(1)

    1. 在 dubbo 管理控制台配置服务降级 上图的配置含义是:consumer 调用 com.zhang.HelloService 的方法时,直接返回 null,不发起远程调用. 实际操作是:在 z ...

  3. Dubbo服务降级

    当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或简单处理,从而释放服务器资源以保证核心业务正常运作或高效运作. 可以通过服务降级功能临时屏蔽某个出错的非关键服务并定义 ...

  4. 13.1 dubbo服务降级源码解析

    从 9.1 客户端发起请求源码 的客户端请求总体流程图中,截取部分如下: //代理发出请求 proxy0.sayHello(String paramString) -->InvokerInvoc ...

  5. Dubbo 服务降级,失败重试怎么做?

    可以通过 dubbo:reference 中设置 mock="return null".mock 的值也可以修 改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名 ...

  6. (万字好文)Dubbo服务熔断与降级的深入讲解&代码实战

    原文链接:(万字好文)Dubbo服务熔断与降级的深入讲解&代码实战 一.Dubbo服务降级实战 1 mock 机制 谈到服务降级,Dubbo 本身就提供了服务降级的机制:而 Dubbo 的服务 ...

  7. dubbo熔断,限流,服务降级

    1 写在前面 1.1 名词解释 consumer表示服务调用方 provider标示服务提供方,dubbo里面一般就这么讲. 下面的A调用B服务,一般是泛指调用B服务里面的一个接口. 1.2 拓扑图 ...

  8. 5.如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?

    作者:中华石杉 面试题 如何基于 dubbo 进行服务治理.服务降级.失败重试以及超时重试? 面试官心理分析 服务治理,这个问题如果问你,其实就是看看你有没有服务治理的思想,因为这个是做过复杂微服务的 ...

  9. 分布式的几件小事(六)dubbo如何做服务治理、服务降级以及重试

    1.服务治理 服务治理主要作用是改变运行时服务的行为和选址逻辑,达到限流,权重配置等目的. ①调用链路自动生成 一个大型的分布式系统,会由大量的服务组成,那么这些服务之间的依赖关系和调用链路会很复杂, ...

随机推荐

  1. Mysql误删了root用户怎么办

    1.停止mysql服务:在mysql安装目录下找到my.ini:在my.ini中找到以下片段[mysqld]:另起一行加入代码:skip-grant-tables 并保存 2.启动mysql服务,并登 ...

  2. Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)

    上节课复习:1.编程思想    面向过程        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...

  3. java 基础知识学习 priorityQueue

      ArrayList:动态扩容(相对于数组),数组实现查询非常快但要求连续内存空间. 双向队列LinkedList:不需要像ArrayList一样创建连续的内存空间,它以链表的形式连接各个节点,但是 ...

  4. JAVA类型信息——Class对象(转载)

    JAVA类型信息--Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...

  5. Ubuntu&nbsp;12.04&nbsp;Eclipse设…

    Ubuntu 12.04 Eclipse设置(黑色背景解决) 分类: ubuntu2012-11-21 10:47 252人阅读 评论(0) 收藏 举报 eclipseEclipseubuntuUbu ...

  6. C 汉字处理

    好像有个wchar_t类型的,这里不深究了,只研究char型(1个字符大小)的 1.定义 直接使用char,但每个汉字占据2个字符,所以必须以字符串形式存在 char s[10]; 2.定义时直接赋值 ...

  7. 4-数组、指针与字符串1.3-this指针

    this指针时一个隐含于每一个类的成员函数中的特殊指针(包括构造函数和析构函数),它用于指向正在被成员函数操作的对象. this指针明确地指出了成员函数当前所操作的数据所属的对象.实际过程是,当通过一 ...

  8. Web.config中的设置 forms 中的slidingExpiration的设置

    在ASP.NET 网站中,使用 Forms Authentication时,一般的设置是如下的: <authentication mode="Forms"> <f ...

  9. 安装VMware-tools出现initctl: Job failed to start

    安装VMware-tools中出现: ******* Creating a new initrd boot image for the kernel.update-initramfs: Generat ...

  10. Newtonsoft.Json序列化字符串-格式化和时间格式问题

    最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json public static void TestJson()        {            DataTable d ...