服务熔断降级简介

2024-06-23 12:48
文章标签 服务 简介 降级 熔断

本文主要是介绍服务熔断降级简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

  很多网站背后都是一个庞大的分布式系统,多个子系统之间的调用大多是远程调用,要么HTTP要么RPC,这种远程调用其实是不可控的,当调用链越长,风险也就越大。
  在微服务中,当一切正常时,请求流看起来是这样的:
在这里插入图片描述
  当其中有一个服务(例如服务I)有延迟时,它可能阻塞整个用户请求:
在这里插入图片描述
  在高流量的情况下,一个依赖服务的延迟可能导致服务器上的所有资源在数秒内饱和,这也意味着后续再有请求将无法立即提供服务:
在这里插入图片描述

解决方案

  当使用熔断降级框架时,框架会包装每个依赖项,原有架构会发生变化,每个依赖项相互隔离,当延迟发生时,它会被限制在资源中,并包含回退逻辑,以决定在依赖项中发生故障时应作出何种响应:
在这里插入图片描述

基础概念

服务雪崩

  当微服务A调用微服务B,B调用C和其他微服务,当调用链上某个服务不可用或响应时间过长,网关路由到A上的请求就会占用越来越多的系统资源,导致系统崩溃,这种现象称作雪崩效应。
在这里插入图片描述

在分布式系统中,为了保证服务的可用性,我们一般会加入重试机制,在有些情况下,重试确实能解决问题,比如网络抖动等。但是有些情况下,重试只会加剧问题的严重性,会给下游服务造成极大的资源压力。
重试不行,不重试也不靠谱,那我们怎么预防服务雪崩呢?答案是熔断器模式

熔断器模式

  熔断器模式(Circuit Breaker Pattern)是一种现代软件开发的设计模式,用来侦测错误,避免不断的触发相同错误导致的灾难性后果。一个完善的熔断器一般有三种状态:

  • 关闭
    • 默认情况是关闭的,熔断器本身自带计数器的功能,每当错误发生一次,计数器会累加,当达到一定条件时,熔断器就会自动跳到开启状态。
  • 开启
    • 在开启状态下,任何请求都会直接被拒绝,并且抛出异常信息。
  • 半开启
    • 在此状态下,断路器会允许部分请求通过,当通过的请求全部成功响应时,断路器会自动关闭。
      在这里插入图片描述

如果在微服务中引入断路器模式,那么整个分布式系统将天然具备快速失败无缝恢复的功能。

服务熔断

  一般是某个服务故障或者是异常引起的,类似于“保险丝”,当某个异常条件被触发,为了防止服务雪崩,直接熔断服务,而不是一直等到此服务超时。
  典型的熔断场景:例如过载保护,当请求线程数过多时被限流,

服务降级

  当服务器压力剧增时,根据当前业务情况及流量,对一些非核心服务进行有策略的停服,缓解服务器资源压力,以保证核心业务的正常运行。

  • 自动降级:超时、失败次数过多、故障
    • 响应时间超过配置的超时时间(异步机制探测回复情况)
    • 不稳的API调用次数达到一定数量(异步机制探测回复情况)
    • 调用的服务出现故障(HTTP状态码、网络故障、RPC服务异常)
  • 人工降级:秒杀、双十一大促,非核心服务停服
熔断和降级异同
  • 相同点
    • 从可用性和可靠性触发,为了防止系统崩溃
    • 最终让用户体验到的是某些功能暂时不能用
  • 不同点
    • 服务熔断一般是下游服务故障导致的
    • 服务降级一般是从整体系统负荷考虑,由调用方控制

Hystrix

配置

circuitBreaker.requestVolumeThreshold    // 滑动窗口的大小,默认为20 
circuitBreaker.sleepWindowInMilliseconds // 过多长时间,熔断器再次检测是否开启,默认为5000,即5s
circuitBreaker.errorThresholdPercentage  // 错误率,默认50%

  这几个参数所表达的意思是:每当20个请求中,有50%失败时,断路器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。5s之后,重新检测该触发条件,判断是否把断路器关闭。
  断路器打开之后,这种错误情况不可能直接传给用户,所以需要准备一个本地的fallback回调函数,返回一个缺省值。

熔断降级代码示例

@GetMapping("/user/{id}")
@HystrixCommand(fallbackMethod ="hystrix_GET")
public User findById(@PathVariable("id") Integer id) {User user = userService.findById(id);if (null == user) {throw new RuntimeException("user not found");}return user;
}// 回调函数
public User hystrix_GET(@PathVariable("id") Integer id) {log.info("in fallbackMethod ..");return null;
}

启动类上加@EnableCircuitBreaker注解,开启服务熔断机制

Feign代码示例

@Component
public class UserClientFallback implements FallbackFactory<UserService> {@Overridepublic UserService create(Throwable throwable) {return new UserService() {@Overridepublic User findById(Integer id) {log.info("停服...");return null;}@Overridepublic List<User> findAll() {log.info("停服...");return null;}};}
}@FeignClient(value = "user-client",fallbackFactory = UserClientFallback.class)
public interface UserClient {@GetMapping("/user/{id}")public User findById(@PathVariable("id") Integer id);@GetMapping("/user")public List<User> findAll();
}
feign:  # 开启feign熔断降级功能hystrix:enabled: true

Sentinel

熔断降级代码示例

@Service
public class TestService {@SentinelResource(value = "sayHello", blockHandler = "sayHelloBlockHandler")public String sayHello(String name) {return "Hello, " + name;}public Object sayHelloBlockHandler(String name, BlockException ex) {log.warn("Sentinel fallback", ex);return "Service down";}
}@RestController
public class TestController {@Autowiredprivate TestService service;@GetMapping(value = "/hello/{name}")public String apiHello(@PathVariable String name) {return service.sayHello(name);}
}

Feign代码示例

@FeignClient(name = "service", fallback = ServiceFallback.class, configuration = FeignConfig.class)
public interface Service {@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)String echo(@PathVariable("str") String str);
}class FeignConfig {@Beanpublic ServiceFallback serviceFallback() {return new ServiceFallback();}
}class ServiceFallback implements Service {@Overridepublic String echo(@PathVariable("str") String str) {return "echo fallback";}
}

熔断降级框架比较

SentinelHystrixresilience4j
隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(RxJava)Ring Bit Buffer
动态规则配置支持多种数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
流量整形支持预热模式、匀速器模式、预热排队模式不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统

Hystrix官网,Hystrix已停止维护,Netflix官方推荐使用resilience4j,它更轻量,支持函数式接口和lambda表达式等使用方式,更加优雅。
Sentinel官网

这篇关于服务熔断降级简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087203

相关文章

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

【Tools】AutoML简介

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 AutoML(自动机器学习)是一种使用机器学习技术来自动化机器学习任务的方法。在大模型中的AutoML是指在大型数据集上使用自动化机器学习技术进行模型训练和优化。

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

SaaS、PaaS、IaaS简介

云计算、云服务、云平台……现在“云”已成了一个家喻户晓的概念,但PaaS, IaaS 和SaaS的区别估计还没有那么多的人分得清,下面就分别向大家普及一下它们的基本概念: SaaS 软件即服务 SaaS是Software-as-a-Service的简称,意思是软件即服务。随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式。 它是一种通过Internet提供

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G