`
y806839048
  • 浏览: 1117274 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Dubbo之服务降级

阅读更多

1.开关 

        先讲一下开关的由来,例如京东在6月18日做店庆促销活动,在交易下单环节,可能需要调用A、B、C三个接口来完成,但是其实A和B是必须的,C只是附加的功能(例如在下单的时候做一下推荐),可有可无,在平时系统没有压力,容量充足的情况下,调用下没问题但是在类似店庆之类的大促环节,系统已经满负荷了,这时候其实完全可以不去调用C接口,怎么实现这个呢?改代码?no,no,no,这样太不敏捷,此时开关诞生了,开发人员只要简单执行一下命令或者点一下页面,就可以关掉对于C接口的调用,在大促过去之后,再把开关恢复回去即可。---类似熔断器(Hystrix),mock

 mock 就是将服务调用加上try catch 中,catch中直接写返回

 

2.什么是服务降级

          服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。


3.服务降级方式:

 

  • 服务接口拒绝服务:无用户特定信息,页面能访问,但是添加删除提示服务器繁忙。页面内容也可在Varnish或CDN内获取。
  • 页面拒绝服务:页面提示由于服务繁忙此服务暂停。跳转到varnish或nginx的一个静态页面。
  •  延迟持久化:页面访问照常,但是涉及记录变更,会提示稍晚能看到结果,将数据记录到异步队列或log,服务恢复后执行。
  •  随机拒绝服务:服务接口随机拒绝服务,让用户重试,目前较少有人采用。因为用户体验不佳。

4.

 




5.



6.服务降级埋点的地方:


        消息中间件:所有API调用可以使用消息中间件进行控制
        前端页面:指定网址不可访问(NGINX+LUA)

        底层数据驱动:拒绝所有增删改动作,只允许查询

 

 

一、dubbo降级服务    

    dubbo开发中,可能由于服务没有启动或者网络不通,调用中会出现RpcException,也就是远程调用失败。如果是服务启动顺序的问题,可能加工check="false"的配置可以得到很好的解决。但是,如果是服务宕掉或者并发数太高导致的RpcException该如何处理?

    经过过12306抢票的人应该经常会遇到这个问题:在抢票高峰的时候,明明票还有,但是查询出来的列表却是为空的(如果没票列表也应该会呈现);等高峰过后再查询,列表又恢复正常。个人猜测应该是查询过程中出现了问题,要么超时,要么网络问题导致查询失败采用的服务降级处理。所以,最终呈现给用户的并不是内部系统出错之类的提示,而是一个空的列表。好了,言归正传,在dubbo中想实现服务降级,需要怎么样做可以实现?

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

二、结合dubbo的例子

说明下面将通过一个例子进行说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**接口定义*/
public interface IUser {
  
    public void addUser(User u);
      
    public User getUserById(int id);
      
}
  
/**实现类*/
public class UserImpl implements IUser {
      
    private static List<User> USER_LIST = new ArrayList<User>();
      
    static{
        for(int i=0;i<10;i++){
            User u = new User();
            u.setAddress("address"+i);
            u.setId(i);
            u.setName("name"+i);
              
            USER_LIST.add(u);
        }
    }
      
    public void addUser(User u) {
        USER_LIST.add(u);
        System.out.println("total:"+USER_LIST.size());
    }
  
    public User getUserById(int id) {
        for(int i=0;i<USER_LIST.size();i++){
            if(USER_LIST.get(i).getId() == id){
                return USER_LIST.get(i);
            }
        }
        return null;
    }
}

 

dubbo-provider.xml配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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.zzq.test.iface.IUser" ref="userImpl" timeout="10000" />
 
    <!-- 和本地bean一样实现服务 -->
    <bean id="userImpl" class="com.zzq.test.ifaceimpl.UserImpl" />
 
</beans>

调用方的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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="iUser" interface="com.zzq.test.iface.IUser"  timeout="10000" check="false" mock="return null">
    </dubbo:reference>
  
</beans>

调用的测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) throws Exception{
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"classpath:dubbo-consumer.xml"});
        context.start();
         
        IUser iUser = (IUser)context.getBean("iUser");
        User u = new User();
        u.setAddress("aaa");
        u.setId(311);
        u.setName("n3");
        iUser.addUser(u);
        System.out.println(iUser.getUserById(1));
    }

通过测试,如果服务启动,则程序按照预期的运行正常;如果服务没启动,则此时运行程序,程序并未报错,打印出null。

三、思考

    通过以上的例子可以知道,通过mock的配置,可以很好的实现dubbo服务降级。但是,仔细查看上面的例子会发现,IUser本身定义了两个接口,一个是新增用户,一个是根据id查询用户信息。对于根据id查询用户信息,在调用失败的时候返回null很好理解,可能是由于验证失败或者记录删除了,但是对于新增用户,可能就需要抛出具体的业务信息,否则程序无法处理后续的业务,包括页面弹出”添加成功“或者列表刷新的时候无法查看到最新的记录,这样体验将会非常不好。所以,如果要有较好的区分,可以通过以下的方式,可以更好的实现降级:

(1)将接口进行归类,查询类和变更操作类:对于查询的分为一个接口类,变更的归类为其他的接口类,这样对于查询的可以使用mock="return null"进行降级操作;对于变更类的,可以仍旧使用try……catch进行异常捕获处理;

(2)配置mock="true",同时mock实现接口,接口名要注意命名规范:接口名+Mock后缀。此时如果调用失败会调用Mock实现。mock实现需要保证有无参的构造方法。

配置mock="true"的情况,对于上面的例子即在IUser的同个路径下,添加类IUserMock,实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class IUserMock implements IUser {
 
    @Override
    public void addUser(User u) {
        throw new RuntimeException("add user fail!");
    }
 
    @Override
    public User getUserById(int id) {
        return null;
    }
 
}

 

分享到:
评论

相关推荐

    面试官:Dubbo怎么实现服务降级,他有什么好处?.doc

    Dubbo 服务降级实现方式和好处 在 Dubbo 框架中,服务降级是一种非常重要的机制,它可以在高峰期或服务出现问题时,降低非核心业务流程的服务调用,以免对核心业务流程产生影响。在本文中,我们将探讨 Dubbo 是如何...

    37_基于dubbo如何做服务治理、服务降级以及重试?.zip

    在IT行业中,服务治理、服务降级和重试策略是微服务架构中不可或缺的重要组成部分,尤其是在基于Dubbo的分布式系统中。本资料包主要探讨了如何在Dubbo框架下实现这些功能,帮助提升系统的稳定性和容错性。 首先,...

    Apache Dubbo+安装部署+附在均衡+限流与降级+服务熔断等

    Dubbo服务治理:限流与降级策略 Dubbo服务治理:服务熔断与超时重试 Dubbo服务治理:服务路由与动态配置 Dubbo监控与运维:服务调用监控 Dubbo监控与运维:服务性能分析 Dubbo高级特性:服务版本与分组 Dubbo高级...

    Apache Dubbo:Dubbo服务治理:限流与降级策略

    ### Apache Dubbo:Dubbo服务治理:限流与降级策略 #### 1. Dubbo服务治理概述 ##### 1.1 Dubbo服务治理的重要性 在微服务架构中,服务之间的交互频繁且复杂,特别是在高并发场景下,某些服务可能会因为请求量过...

    Dubbo分布式服务管理

    5. 服务降级:在系统负载过高或服务异常时,可以自动降级,保证核心服务的稳定。 6. 服务熔断:防止雪崩效应,当服务调用失败达到一定阈值时,自动熔断。 三、Dubbo服务的生命周期 1. 创建服务提供者:配置服务...

    Dubbo分布式服务框架入门2

    - **服务治理**: 包括服务注册与发现、服务版本控制、服务分组、服务降级、熔断、限流等,这些都是微服务架构中的关键元素。 - **协议与序列化**: Dubbo支持多种通信协议(如Dubbo协议、RMI、Hessian等)和序列化...

    dubbo 服务提供方 服务消费方

    - **服务治理**:Dubbo提供了诸如熔断、降级、限流、隔离等服务治理功能,增强系统的稳定性和容错性。 - **集群模式**:服务提供方可以以集群形式部署,提高服务的可用性和冗余,服务消费方通过负载均衡策略调用...

    Dubbo分布式服务框架

    【Dubbo分布式服务框架】是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它提供了丰富的服务治理功能,包括服务注册、服务发现、负载均衡、容错机制等,旨在提高微服务架构下的服务调用效率和系统稳定性。Dubbo...

    dubbo服务调用

    在本文中,我们将深入探讨如何利用 Dubbo 实现服务调用,并了解其超时、重试、服务降级和服务熔断等关键特性。 1. **服务调用** 在 Dubbo 中,服务调用是通过服务接口来完成的。服务提供者暴露服务接口,而服务...

    springboot集成dubbo实现服务提供调用

    - **服务治理**:了解Dubbo的负载均衡策略、服务路由、服务降级、熔断等高级特性。 - **服务监控**:配置Dubbo Admin或者使用其他监控工具,实时查看服务的运行状态。 - **分布式事务**:学习如何在Spring Boot和...

    dubbo 分布式服务框架 开发者学习文档 PDF格式

    依赖分析与降级是Dubbo在复杂分布式环境中保证服务稳定性的另一重要手段。通过依赖分析,可以清晰地了解服务间的调用关系,避免因某个服务故障导致整个系统的连锁反应。降级策略则允许在系统压力过大或服务不可用时...

    Apache Dubbo:Dubbo高级特性:服务降级与熔断实战

    Apache Dubbo:Dubbo高级特性:服务降级与熔断实战 Dubbo是著名的RCP框架,文档内有干货,提供代码和可复现的命令,值得借鉴。

    dubbo服务限制并发量示例

    通过阅读和分析源码,开发者可以更深入地理解 Dubbo 内部的工作原理,包括并发控制、路由规则和服务降级的实现细节,这对于定制化开发和优化服务性能非常有帮助。 综上所述,理解和掌握这些知识点对于构建健壮、可...

    dubbo服务和消费

    此外,Dubbo还支持负载均衡、容错、服务治理等一系列高级特性,如失败重试、降级策略、熔断机制等,这些都是构建高可用分布式系统的关键。 总的来说,通过这个基于Maven的web工程,我们可以深入学习Dubbo的两大核心...

    Apache Dubbo:Dubbo服务治理:服务路由与动态配置

    同时,Dubbo 支持服务降级,即在服务不可用时,返回一个默认的响应,保证系统的基本可用性。 通过这些功能的综合运用,开发者可以构建出既高效又稳定的微服务架构。总之,Apache Dubbo 的服务治理特性不仅能够帮助...

    dubbo服务接口

    在服务不可用或网络不稳定时,Dubbo支持服务降级和熔断机制,以防止系统雪崩。 六、实战应用 在实际项目中,`dubbo-interface-web`模块可能包含Web层对Dubbo服务接口的调用。它将HTTP请求转化为对Dubbo服务的调用...

    Dubbo服务框架 v2.6.12.zip

    首先,Dubbo的核心功能在于服务注册与发现、负载均衡、熔断降级、调用链跟踪等,这些特性使得开发者可以构建出高可用、高扩展性的微服务架构。在服务注册与发现方面,Dubbo支持Zookeeper、Eureka等多种注册中心,...

    尚硅谷最新dubbo视频

    本套视频从分布式系统的基本概念出发,由浅入深,讲解了RPC原理,Dubbo基本使用,Dubbo高可用场景以及Dubbo原理,涉及了分布式系统中服务注册、服务发现、负载均衡、灰度发布、集群容错、服务降级等核心概念的讲解及...

    基于Dubbo管理控制台的服务治理.doc

    - **服务降级**:在系统压力过大或服务不可用时,服务降级可以提供应急策略,例如返回默认值、抛出异常或直接忽略,保障核心业务的稳定运行。 除了上述内容,Dubbo管理控制台还提供服务监控、熔断机制、服务限流等...

Global site tag (gtag.js) - Google Analytics