Spring cloud - Hystrix服务限流、熔断及降级

Hystrix的作用

Hystrix的主要作用是在微服务环境下防止服务雪崩,确保服务弹性及可用性。

具体来说,Hystrix可以实现:

  1. 服务降级:通过fallback实现服务不可达情况下的服务降级作用。
  2. 熔断:服务不可达的情况下在设定时间窗口范围内熔断服务,快速fallback。
  3. 限流:通过信号量或线程池的模式实现限流,确保服务在流量高峰时的可用性。

Hystrix服务降级

前面文章我们已经分析过,通过@HystrixCommand注解实现服务降级:

@HystrixCommand(fallbackMethod = "fallback",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")})

@HystrixProperty之execution.isolation.thread.timeoutInMilliseconds:指定Hystrix的服务超时判定时长,超过该时长则认为服务调用失败
fallbackMethod:服务调用超时或发生异常的情况下的fallback替代方法,也就是降级后的服务。

Hystrix熔断

官网熔断流程图:
在这里插入图片描述

熔断机制的含义是,在服务不可用的情况下,除了fallback提供服务降级之外,如果失败的调用达到设定的条件后,会触发断路开关打开,断路开关打开后,后续对失败服务的请求会被直接fallback,直到断路开关状态变更为半开半闭或闭合。

可以发现熔断的概念和电路保险熔断的概念一样:当电路中某一电器工作不正常后,会自动熔断保险丝断开电路,起到对该电器以及电路的保护,直到电器恢复正常后重新焊接保险丝后,电路才会正常工作。

Hystrix断路开关的状态:

  1. 闭合:默认为闭合状态,可以对服务正常调用。
  2. 打开:服务调用失败达到设定的阈值后打开,一定时间范围(MTTR 平均故障处理时间)内不会调用服务。打开时长达到MTTR设置的时间后,切换到半熔断状态(半开半闭)。
  3. 半开半闭:半熔断状态,此状态下允许请求访问服务一次,如果访问成功则关闭断路器,否则再次打开断路器。

默认情况下Hystrix的断路开关处于闭合状态,触发断路开关打开的条件是:在设定时间窗口范围内、请求次数达到设置次数、错误调用达到一定比例。

Hystrix断路器设置:

            @HystrixCommand(fallbackMethod = "fallback", commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),//是否开启断路器@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),// 请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),// 时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")// 失败率达到多少后跳})

断路器的重要参数:
circuitBreaker.sleepWindowInMilliseconds:时间窗口期
circuitBreaker.requestVolumeThreshold:请求次数
circuitBreaker.errorThresholdPercentage:请求失败的比例
circuitBreaker.circuitBreakerSleepWindowInMilliseconds:故障恢复时长。断路器打开状态下、本参数设置的时间窗口范围内的请求直接被fallback,之后的一次请求会被放行访问服务。如果访问成功则关闭断路器,否则再次打开断路器。

以上设置的含义是:在10秒的时间范围内,请求次数达到10次,并且请求失败的比例达到60%,则打开断路开关。

以上配置下,如果在10秒内连续请求某服务10次、错误6次,则打开断路器。

Hystrix限流

Hystrix提供两种方式的限流:

  1. 线程池
  2. 信号量

线程池限流

在这里插入图片描述
Hystrix允许通过@HystrixCommand注解设置当前服务的线程池:

        @HystrixCommand(groupKey="threadA",threadPoolKey="threadA",threadPoolProperties = {@HystrixProperty(name = "coreSize", value = "20"),@HystrixProperty(name = "maximumSize", value = "30"),@HystrixProperty(name = "maxQueueSize", value = "20"),@HystrixProperty(name =  "keepAliveTimeMinutes", value = "2")},commandProperties = {@HystrixProperty(name = "execution.isolation.strategy",value = "THREAD")

每一服务的线程池单独设置、互不影响。

参数:

  1. “execution.isolation.strategy”:设置为“THREAD”指定限流方式为线程池。
  2. coreSize:线程池核心线程数。
  3. maximumSize:线程池最大线程数。
  4. maxQueueSize:最大队列数。
  5. keepAliveTimeMinutes:空闲线程最大存活时长。

采用线程池的方式可以实现有效限流,当并发请求大于maximumSize后,如果队列已满则立即fallback,否则请求会进入到队列排队等待线程释放后再执行。所以,在线程池控制下,并发请求数不会超过maximumSize。

信号量

@HystrixCommand(fallbackMethod = "fallback",commandProperties = {@HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests",value = "100"),@HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"),@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "10000")})

参数

  1. execution.isolation.strategy:SEMAPHORE通过信号量方式隔离
  2. maxConcurrentRequests:最大并发请求数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/195515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python---练习:封装一个函数,用于生成指定长度的验证码

练习涉及相关链接:Python---练习:编写一段Python代码,生成一个随机的4位验证码-CSDN博客 Python----函数中的说明文档-CSDN博客Python---return返回值-CSDN博客 代码: # 定义一个generate_code()函数 def generate_code(num): …

〖大前端 - 基础入门三大核心之JS篇㊳〗- DOM访问元素节点

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

基于一致性算法的微电网分布式控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿,实现功率均分,保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类:协调同…

探索无限可能:APITable免费开源多维表格与可视化数据库远程访问的魅力

APITable免费开源的多维表格与可视化数据库公网远程访问 文章目录 APITable免费开源的多维表格与可视化数据库公网远程访问前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c…

JAVA多线程(5)

JAVA多线程(5) 线程安全问题概述 卖票问题分析 单窗口卖票 一个窗口(单线程)卖100张票没有问题 单线程程序是不会出现线程安全问题的 多个窗口卖不同的票 3个窗口一起卖票,卖的票不同,也不会出现问题 多线程程序,没有访问共享数据,不会产生问题 多个窗口卖相同的票 3个窗口…

C语言:动态内存管理

目录 为什么存在动态内存分配 动态内存函数 malloc和free 示例 calloc 示例 realloc 示例 常见的动态内存错误 对NULL指针的解引用操作 对动态开辟的空间进行越界访问 对于非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块内存多次释…

有成效的工作

从开始上班起,听到过工作是做不完得。 大概的意思,现在的工作做完了,就会分配新的工作。所以总也做不完。 如果是做不完的,那么是不是在一个岗位上就一直干着呢。既然这个很难成立。那其实工作是可以干得完的。 一个岗位的终结&am…

MyISAM和innoDB两种引擎的对比

innoDB 3.23就有了innoDB引擎,5.5成为了默认引擎,支持外键 是一种事务型引擎,可以保证完整提交和回滚 更新、删除比较多的场景,推荐使用innoDB 不过innoDB对内存要求高,因为索引和数据存到一个表了;写操作…

PyQt(学习笔记)

学习资料来源: PyQt快速入门——b站王铭东老师 PyQt(学习笔记) Pycharm环境准备运行第一个程序QPushButtonQLabelQLineEdit调整窗口大小、位置、图标布局信号与槽PyQt引入多线程 Pycharm环境准备 新建环境——添加PyQt5模块——验证版本 如果…

手写消息队列(基于RabbitMQ)

一、什么是消息队列? 提到消息队列是否唤醒了你脑海深处的记忆?回看前面的这篇文章:《Java 多线程系列Ⅳ(单例模式阻塞式队列定时器线程池)》,其中我们在介绍阻塞队列时说过,阻塞队列最大的用途…

K-Means聚类

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 K-means聚类算法实现 技术细节 选取的数据集是sklearn.datasets里面的鸢尾花数据集,方便最后的算法评价。 根据手肘法(即根据SSE代价函数)得出最合适的k值。 此处思路是先根据E …

ZJU Beamer学习手册(二)

ZJU Beamer学习手册基于 Overleaf 的 ZJU Beamer模板 进行解读,本文则基于该模版进行进一步修改。 参考文献 首先在frame文件夹中增加reference.tex文件,文件内容如下。这段代码对参考文献的引用进行了预处理。 \usepackage[backendbiber]{biblatex} \…