1 、简介

什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。

如果还是不理解,那么可以举个例子:假如目前有很多人想要给我付钱,但我的服务器除了正在运行支付的服务之外,还有一些其它的服务在运行,比如搜索、定时任务和详情等等。然而这些不重要的服务就占用了JVM的不少内存与CPU资源,为了能把钱都收下来(钱才是目标),我设计了一个动态开关,把这些不重要的服务直接在最外层拒掉,这样处理后的后端处理收钱的服务就有更多的资源来收钱了(收钱速度更快了),这就是一个简单的服务降级的使用场景。

2 、使用场景

服务降级主要用于什么场景呢?当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,我们可以将一些 不重要 或 不紧急 的服务或任务进行服务的 延迟使用 或 暂停使用

3 、核心设计

3.1 分布式开关

根据上述需求,我们可以设置一个分布式开关,用于实现服务的降级,然后集中式管理开关配置信息即可。具体方案如下:

  • 超时降级 —— 主要配置好超时时间和超时重试次数和机制,并使用异步机制探测恢复情况

  • 失败次数降级 —— 主要是一些不稳定的API,当失败调用次数达到一定阀值自动降级,同样要使用异步机制探测回复情况

  • 故障降级 —— 如要调用的远程服务挂掉了(网络故障、DNS故障、HTTP服务返回错误的状态码和RPC服务抛出异常),则可以直接降级

  • 限流降级 —— 当触发了限流超额时,可以使用暂时屏蔽的方式来进行短暂的屏蔽

当我们去秒杀或者抢购一些限购商品时,此时可能会因为访问量太大而导致系统崩溃,此时开发者会使用限流来进行限制访问量,当达到限流阀值,后续请求会被降级;降级后的处理方案可以是:排队页面(将用户导流到排队页面等一会重试)、无货(直接告知用户没货了)、错误页(如活动太火爆了,稍后重试)。

3.3 配置中心

微服务降级的配置信息是集中式的管理,然后通过可视化界面进行友好型的操作。配置中心和应用之间需要网络通信,因此可能会因网络闪断或网络重启等因素,导致配置推送信息丢失、重启或网络恢复后不能再接受、变更不及时等等情况,因此服务降级的配置中心需要实现以下几点特性,从而尽可能的保证配置变更即使达到:

  • 启动主动拉取配置 —— 用于初始化配置(减少第一次定时拉取周期)

  • 发布订阅配置 —— 用于实现配置及时变更(可以解决90%左右的配置变更)

  • 定时拉取配置 —— 用于解决发布订阅失效或消失丢失的情况(可以解决9%左右的发布订阅失效的消息变更)

  • 离线文件缓存配置 —— 用于临时解决重启后连接不上配置中心的问题

  • 可编辑式配置文档 —— 用于直接编辑文档的方式来实现配置的定义

  • 提供Telnet命令变更配置 —— 用于解决配置中心失效而不能变更配置的常见

3.4 处理策略

当触发服务降级后,新的交易再次到达时,我们该如何来处理这些请求呢?从微服务架构全局的视角来看,我们通常有以下是几种常用的降级处理方案:

  • 页面降级 —— 可视化界面禁用点击按钮、调整静态页面

  • 延迟服务 —— 如定时任务延迟处理、消息入MQ后延迟处理

  • 写降级 —— 直接禁止相关写操作的服务请求

  • 读降级 —— 直接禁止相关度的服务请求

  • 缓存降级 —— 使用缓存方式来降级部分读频繁的服务接口

针对后端代码层面的降级处理策略,则我们通常使用以下几种处理措施进行降级处理:

  • 抛异常

  • 返回NULL

  • 调用Mock数据

  • 调用Fallback处理逻辑

4 、高级特性

我们已经为每个服务都做好了一个降级开关,也已经在线上验证通过了,感觉完全没问题了。

场景一:某一天,运营搞了一次活动,突然跑过来说,现在流量已经快涨到上限了,有没有批量降级所有不重要服务的方式?开发一脸懵逼的看着,这又不是操作DB,哪里有批量操作呀。

 场景二:某一天,运营又搞事了,说我们等下要搞一个活动,让我们赶紧提前把不重要的服务都降级了,开发又是一脸懵逼,我怎么知道要降级哪些服务呀。

反思:服务降级的功能虽然是实现了,可是没有考虑实施时的体验。服务太多,不知道该降级哪些服务,单个操作降级速度太慢……

4.1 分级降级

当微服务架构发生不同程度的情况时,我们可以根据服务的对比而进行选择式舍弃(即丢车保帅的原则),从而进一步保障核心的服务的正常运作。

如果等线上服务即将发生故障时,才去逐个选择哪些服务该降级、哪些服务不能降级,然而线上有成百上千个服务,则肯定是来不及降级就会被拖垮。同时,在大促或秒杀等活动前才去梳理,也是会有不少的工作量,因此建议在开发期就需要架构师或核心开发人员来提前梳理好,是否能降级的初始评估值,即是否能降级的默认值。

为了便于批量操作微服务架构中服务的降级,我们可以从全局的角度来建立服务重要程度的评估模型,如果有条件的话,建议可以使用 层次分析法(The analytic hierarchy process,简称AHP) 的数学建模模型(或其它模型)来进行定性和定量的评估(肯定比架构师直接拍脑袋决定是否降级好很多倍,当然难度和复杂度也会高许多,即你需要一个会数学建模人才),而层次分析法的基本思路是人对一个复杂的决策问题的思维和判断过程大体上是一样的。

以下是个人给出的最终评价模型,可作为服务降级的评价参考模型进行设计:

我们利用数学建模的方式或架构师直接拍脑袋的方式,结合服务能否降级的优先原则,并根据台风预警(都属于风暴预警)的等级进行参考设计,可将微服务架构的所有服务进行故障风暴等级划分为以下四种:

评估模型

  • 蓝色风暴 —— 表示需要小规模降级非核心服务

  • 黄色风暴 —— 表示需要中等规模降级非核心服务

  • 橙色风暴 —— 表示需要大规模降级非核心服务

  • 红色风暴 —— 表示必须降级所有非核心服务

设计说明

  • 故障严重程度为:蓝色<黄色<橙色<红色

  • 建议根据二八原则可以将服务划分为:80%的非核心服务+20%的核心服务

以上模型只是整体微服务架构的服务降级评估模型,具体大促或秒杀活动时,建议以具体主题为中心进行建立(不同主题的活动,因其依赖的服务不同,而使用不同的进行降级更为合理)。当然模型可以使用同一个,但其数据需要有所差异。最好能建立一套模型库,然后实施时只需要输入相关服务即可输出最终降级方案,即输出本次大促或秒杀时,当发生蓝色风暴时需要降级的服务清单、当发生黄色风暴时需要降级的服务清单……

4.2 降级权值

微服务架构中有服务权值的概念,主要用于负载时的权重选择,同样服务降级权值也是类似,主要用于服务降级选择时的细粒度优先级抉择。所有的服务直接使用以上简单的四级划分方式进行统一处理,显然粒度太粗,或者说出于同一级的多个服务需要降级时的 降级顺序 该如何?甚至我想要人工智能化的 自动降级,又该如何更细粒度的控制?

基于上述的这些AI化的需求,我们可以为每一个服务分配一个降级权值,从而便于更加智能化的实现服务治理。而其评估的数值,同样也可以使用数学模型的方式进行 定性 与 定量 的评估出来,也可以架构师根据经验直接拍脑袋来确定。

5 、总结与展望

以上提供了半实际与半理论的服务降级方案,使用者可以根据其公司的实际情况进行适当的选择,而完整的方案,笔者目前也没有发现有实施过的,但可以建议有长远服务治理规划的大厂进行完整方案的研究与实施,会对未来人工智能万物互联的时代有较好的治理价值存在(个人看法)。而小厂出于成本和其发挥的价值的考虑,不建议使用这么复杂的方案,但可以实现分布式开关和简单分级降级的功能特性。

本文主要以服务降级为核心进行更加理想的治理微服务架构,其中建议运用数学领域的适当模型来实现 定性 和 定量 的合理分析和治理微服务,为未来 人工智能治理微服务(Artificial Intelligence Governance Micro Service,简称AIGMS)提供方案支持。

下面举个简单大代码示例:

/*** @Description: 修改microservicecloud-api工程,根据已经有的DeptClientService接口
新建
一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory* @author zzyy* @date 2020年2月17日*/

这里我们那get方法举一个例子

package com.atguigu.springcloud.service;
import com.atguigu.springcloud.entities.Dept;
import feign.hystrix.FallbackFactory;
import java.util.List;/*** @Description: 修改microservicecloud-api工程,根据已经有的DeptClientService接口
新建
一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory* @author zzyy* @date 2018年4月21日*/
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {@Overridepublic DeptClientService create(Throwable throwable) {return new DeptClientService(){@Overridepublic Dept get(long id) {return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭").setDb_source("no this database in MySQL");}@Overridepublic List<Dept> list() {return null;}@Overridepublic boolean add(Dept dept) {return false;}};}
}

最后注意不能忘记在类DeptClientServiceFallbackFactory加上注解@Component

修改完成之后我们还需要讲Api重新编译打包  rebuild module "microservicecloud-api"

修改microservicecloud-consumer-dept-feign的yml文件

server:port: 80eureka:client:register-with-eureka: falseservice-url:#defaultZone: http://localhost:7001/eureka/      #单机版defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

SpringAop思想加入(服务降级):

重新启动正常访问

降服务提供者(microservicecloud-provider-dept-8001)关闭

由返回可知服务起到了降级作用

重新启动微服务再次正常

springcloud 服务降级相关推荐

  1. Springcloud服务降级 Error creating bean with name ‘deptConsumerController‘: Unsatisfied dependency expre

    在B站看狂神说Springcloud视频时做服务降级,启动消费者报错 在错误信息中我们可以看到报错信息:没有服务降级实力在我们这个的类中 猜想:是不是没有扫描到我们的这个包,于是在项目启动时手动配置我 ...

  2. SpringCloud学习笔记7——初级篇之服务降级

    六.Hystrix Hystrix官方宣布,停止更新,进入维护阶段,但Hystrix非常优秀,属"业界标杆" 1.Hystrix断路器知识点 能做的事:服务降级.服务熔断.接近实时 ...

  3. springcloud(Hystrix服务降级,服务熔断)

    基础知识 首次分布式服务系统面临的问题 复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖有时候难免发生问题,这个时候可能引发连锁反应,导致整个系统雪崩. 所以就有了Hystrix: 官网地址 ...

  4. 手把手教你搭建SpringCloud项目(十)集成Hystrix之服务降级

    Spring Cloud全集文章目录: 零.什么是微服务?一看就会系列! 一.手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二.手把手教你搭建SpringCloud项目(二)生产 ...

  5. SpringCloud微服务-服务注册发现-负载均衡-服务调用-服务降级-服务网关-配置中心-消息总线-消息驱动-链路追踪-alibaba-nacos-sentinel-seata理论原理分析

    SpringCloud理论技术 概述 ​ Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总 ...

  6. SpringCloud进阶-Hystrix的服务降级

    提示:本文主要对Hystrix的服务降级进行总结 文章目录 前言 一.服务降级 1.1 8001 fallback 1.1.1 业务类启用 1.1.2 主启动类激活 1.2 80 fallback 1 ...

  7. SpringCloud之服务降级(总体第四篇)

    前面相关文章已经学习到了服务注册中心,服务调用,的Ribbon,LoadBalancer,Feign和OpenFeign,Consul,Zookeeper等相关内容.接下来学习服务降级. 一.Hyst ...

  8. Java B2B2C多用户商城 springcloud架构-服务容错保护(Hystrix服务降级)

    动手试一试 Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.在开始使用Spring Cloud Hystrix实现断路器之前,我们先拿之前实现的一些内容作为 ...

  9. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝 ...

最新文章

  1. android 不同activity之间传递数据
  2. Anaconda:conda install packages error 详解channel 设置
  3. CAN总线技术 | 物理层01 - CAN信号电平
  4. Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期
  5. 大数据,TB、PB、EB
  6. Spring Boot(二):Web 综合开发
  7. 【Iterm2】如何解决iterm2窗口自动隐藏的问题
  8. 实验一 201521410003 15网一 叶萌熙
  9. Android 的座位图控件,用于电影票等选座页面的 APP 中
  10. HTTP有哪些特点?
  11. mac 10.8 montion lion 山狮系统上 安装 rails 和 oci8 连 oracle 数据库
  12. 原生html+css+js制作宠物小精灵icon
  13. 电脑连上Jink后打开Altium Designer弹出Failed to measure TotalIRLen(6)
  14. 中科曙光宁畅R620 G40安装Centos7识别不到硬盘
  15. word文档在保存后消失,如何恢复?
  16. AWS 亚马逊云良好架构框架
  17. java安装以及配置环境变量详细步骤
  18. Idea创建SpringBoot搭建SSM框架项目,支持JSP页面
  19. framework层的event_log分析
  20. python做一个简单的对战游戏

热门文章

  1. oracle em界面监控出来的奇怪图像_海康poe主机断电重启后不出图像,显示用户被锁定...
  2. 主成分分析(PCA)及其可视化——matlab
  3. 【youcans 的 OpenCV 例程200篇】127. 形态算法之细化
  4. 【OpenCV 例程200篇】28. 图像的旋转(直角旋转)
  5. matlab的fftn,matlab fftn
  6. rt-thread怎么使用数码管_三菱FX PLC功能指令,怎么学?
  7. 接口自动化实战设计思路,想法及疑问(一)
  8. Python中map()函数用法
  9. 【Python】Paramiko模块在Windows10中import ssl报错的处理方法
  10. 使用网络TCP搭建一个简单文件下载器