服务降级熔断小总结|学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 快速学习服务降级熔断小总结

开发者学堂课程【微服务框架 Spring Cloud 快速入门服务降级熔断小总结】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/614/detail/9364


服务降级熔断小总结


目录

一、分布式系统面临的问题

二、服务雪崩解释

三、何为服务熔断

四、何为降级

 

前面已经完成了服务熔断和服务降级,这两个概念非常容易让人模糊,现在进行一下简单的总结。

 

一、分布式系统面临的问题

复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败。

例子:

image.png

前面讲过,在复杂的分布式系统当中,一定会有各个微服务之间的调用在调用的过程当中,由于微服务之间结偶了,但是服务型的通信避免不了有异常超时,这个时候如图中所说,这个AI这儿假设现在是一个用户请求,但如果10万个用户请求,都会到I这儿,每个用户等三秒钟,10万个时候为了避免在超时出故障的时候,引起大面积的服务调用系统资源瞬间被挂起耗死的情况,这个时候只能完成相应的切割和熔断

 

二、服务雪崩解释:

多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他微服务。这就是所谓的扇出,如果扇出的链路上某个微服务的调用响应时间过长或者不可用对微服务A的调用,就会占用越来越多的系统资源进而引起系统崩溃,所谓的雪崩效应。

回忆一下刚才所说的:

Public class DeptController

{

@Autowired

private DeptService service = null;

@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)

//-旦调用服务方法失败并抛出了错误信息后,会自动调用 @HystrixCommand 标注好的 fallbackMethod 调用类中的指定方法

@HystrixCommand(fallbackMethod = "processHystrix_Get")

public Dept get(@PathVariable("id") Long id)

{

//由于他这是要返回一个Dept干脆因势利导也返回一个Dept但是这个 Dept 里面的信息已经完全变了,相当于是一个带着异常信息的一个返回值。

Dept dept = this.service.get(id);

if (null == dept) {

throw new RuntimeException("ID:"+ id + "没有对应的信息");

}

//故意人为的抛出一个异常,可以当作在调微服务提供者在熔断8001的时候故意A调B,B这个微服务就是这个熔断8001出了故障,要是出了故障,这个时候抛出了一个异常,针对于我调用哪个方法(get)哪个方法出现了异常。用了@HystrixCommand这个,然后由fallbackMethod来进行操作。

processHystrix_Get)。

return dept;

}

Public Dept processHystrix_Get(@PathVariable("id") Long id)

{

return new Dept().setDeptno(id).setDname("ID:"+ id + 没有没有对应的信息,null--@HystrixCommand")

. setDb_source("no this database in MySQL");

//前端工程师去解析的时候,比如【no this database in MySQL】写成【4444】,假设前端工程师取某一个字段是一个失败的值的话,那么就会进行一种友好页面的提示或者是异常的处理。

 

三、何为服务熔断?

服务熔断:

一般是某个故障或者异常引起,类似现实世界中的“保险丝”,当某个异常条件被触发,直接熔断整个服务。而不会一直等到此服务超时。导致服务系统的资源大面积的被占用。

异常引起:

Public class DeptController

{

@Autowired

private DeptService service = null; 

@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)

//-旦调用服务方法失败并抛出了错误信息后,会自动调用 @HystrixCommand标注好的 fallbackMethod 调用类中的指定方法

@HystrixCommand(fallbackMethod = "processHystrix_Get")

public Dept get(@PathVariable("id") Long id)

{

Dept dept = this.service.get(id);

if (null == dept) {

throw new RuntimeException("ID:"+ id + "没有对应的信息");

}

//故意当查询235的那个号或者9999这个 ID 数据库里面没有的,查出来是个 nullnull 就抛异常。

return dept;

}

Public Dept processHystrix_Get(@PathVariable("id") Long id)

{

return new Dept().setDeptno(id).setDname("ID:"+ id + 没有没有对应的信息,null--@HystrixCommand")

. setDb_source("no this database in MySQL");

这就是服务熔断,后面讲的两个小问题,既然由熔断了从技术和应用的角度又为什么会有降级?

先说技术:Spring Cloud 有两个重要的支柱,一个是 IOC 一个是 AOP。AOP 就是面向切面的工程,应该把主业物跟异常处理给他做成一个切面,用织入的方式执行。也就是说业务逻辑方法里面就不应该带着这么多横向横切性关注点,这种异常的处理信息。实现主业务方法后的异常处理,熔断处理的解耦这是第一步,第二个要避免方法膨胀,这些get方法及底层还是这个 service 接口

package  com. atguigu. spr ingc loud.service;

import  java.util.list;

public interface DeptService

{

public  boolean ada(Dept dept);

public  Dept  get(Long id);

public List list();

}

这个接口里面这个方法,如果针对这个接口里面的每一个方法做一次熔断处理,做一次服务的异常情况的处理,可以避免不用每一个方法头上都添加一个fallbackMethod方法,将把分散的fallbackMethod方法集中起来统一的放在一个接口里面

* @Desriptionmicrosenicecloud-api 工程,根已有的 DeptClientService

一个实现了 FallbackFactory 接口的 DeptClientServiceFallbackFactory

* @author zzyy

* @date 20184421

*/

//@FeignClient(value = "MICROSERVICECLOUD-DEPT")

@FeignClient(value - "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class 

public interface DeptClientService

{

@RequestMapping(value = "/dept/get/{id}", method = RequestMethod GET)

public Dept get (@PathVariable("id") long id);

@RequestMapping(value = " /dept/list", method = RequestMethod.GET)

public List list();

@RequestMapping(value = "/dept/add", method = RequestMethod.POST)

public boolean add(Dept dept);

}

注意这个接口是API的,这个接口统一的提出来让他针对于某个微服务,然后这个微服务要用这个接口,如果调用这个接口里面的任何一个方法,出了问题以后FallbackFactory这个类来实现

import java.util.List;

@Component//不要忘记添加,不要忘记添加

Public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientServiceoverride>

{

@Override

public DeptClientService create(Throwable throwable)

return new DeptClientService(){

@Overrid

Public Dept get(longvid)

{

return new Dept().setDeptno(ID).setDname("该ID:"+id+"没有没有对应的信息,Consumer 客户端提供的降级信息,此刻服务 provider 已经关闭”)

.setDb_source("no this database in MySQL");

}

@Override

publicListlist()

Return null;

}

@Override

public boolean add (Dept dept)

{

Return false;

}

 

四、何为降级:

image.png

比如现在 ABC 三个系统,每个系统有5个开发工程师支撑,平时都是大家是平等的关系,但是,为了保证A系统能够充分的开发,现在客户比较注重A系统的功能,要投入更多的资源,希望这一个月以内程序员的数量增加到10个,这个时候要从其他项目做借调资源程序员过来支援A,这就是忍痛某些服务先关掉,现在这种情况,刚才的这种项目管理上借调这种问题,就是为了保证A这个系统资源开发充分先把C借调过来C这个微服务,这个项目的资源被抽掉了,抽掉了以后,对C而言服务被做了降级,但是有可能还有其他FM这个C这个时候就要从服务降级的侧面考虑。

服务降级:

所谓降级,一般是从整体到负荷考虑,是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的 Fall back 回调,返回一个缺省值。

降级说过了,一般从整体符合考虑一定要深刻理会理会这句话整体资源快不够了,忍痛将某些服务先关掉,就可以看到服务器都关了,将不再被调用,8001C现在都给它关了,客户端为了避免导致整个系统被挂机资源被占用耗尽死循环死锁各种异常现象,赶快保证服务的健壮性,客户端自己就做了一套本地的 Fall back 回调的方法,可以返回一个缺省值

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
Java Spring
降级与熔断处理
降级与熔断处理
|
6月前
|
监控 Java 微服务
服务降级和服务熔断的区别
服务降级和服务熔断的区别
|
设计模式 监控 算法
高可用三大利器 — 熔断、限流和降级
在武侠世界里,“利器”通常指的是武器中的上乘、出色之物;武器对于武者的重要性不言而喻,拥有一把优秀的武器可以让武者在战斗中更加得心应手,威力更强。在分布式系统追求高可用的背景下,熔断、限流和降级这三个重要的策略可以称得上三大利器。降级和熔断是不是一回事?限流 与 降级呢?
226 2
|
缓存 监控 前端开发
服务降级是什么?
服务降级是在面对系统负载过高、资源不足或外部依赖故障等异常情况下,通过临时屏蔽某些功能或改变服务行为,以保证核心功能的可用性和性能稳定性的一种策略。
475 0
|
Dubbo 应用服务中间件 开发者
服务降级|学习笔记
快速学习服务降级
服务降级|学习笔记
|
运维 监控 负载均衡
服务熔断|学习笔记
快速学习服务熔断
服务熔断|学习笔记
|
Java 开发者 Sentinel
SentineI 服务熔断降级的策略 | 学习笔记
快速学习 SentineI 服务熔断降级的策略
129 0
熔断和限流原理和使用(3)
熔断和限流原理和使用(3)
260 0
熔断和限流原理和使用(3)
熔断和限流原理和使用(4)
熔断和限流原理和使用(4)
127 0
熔断和限流原理和使用(4)
|
算法
熔断和限流原理和使用(2)
熔断和限流原理和使用(2)
185 0
熔断和限流原理和使用(2)