Hystrix熔断/断路器

简介

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

"断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

导包:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

降级熔断限流理论

服务降级(fallback)

当请求的处理超过预期等待时间或报错时,将该服务降级不进行处理,返回一个友好提示
服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback

服务熔断 circuitBreaker

类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。

服务的降级 -> 进而熔断 -> 恢复调用链路

服务限流

秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行。

服务降级

服务端降级:

  1. 在启动类上加入注解@EnableCircuitBreaker

  2. 在业务方法上加入注解:@HystrixCommand表明出错的条件以及出错时兜底的方法。这里设定超时时间为3s

    @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")})public String paymentInfo_TimeOut(Integer id){int timeNum=5;try {TimeUnit.SECONDS.sleep(timeNum);} catch (InterruptedException e) {throw new RuntimeException(e);}return "线程池"+Thread.currentThread().getName()+"paymentInfo_timeOUT  id:"+id+"耗时"+timeNum;}public String paymentInfo_TimeOutHandler(Integer id){return "线程池"+Thread.currentThread().getName()+"paymentInfo_timeOUTHandler 服务出错了!!!";}

客户端服务降级:一般常用在客户端

  1. 在主启动类上加入@EnableHystrix注解。因为客户端一般与OpenFeign一起调用,OpenFeign注解包含了EnableCircuitBreaker注解。
  2. 在controller业务方法上加入相关注解
@GetMapping("/consumer/payment/hystrix/timeout/{id}")@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")})public String paymentInfo_timeOUT(@PathVariable("id") Integer id){String s = paymentHystrixService.paymentInfo_timeOUT(id);return s;}public String paymentInfo_TimeOutHandler(@PathVariable("id") Integer id){return "我是消费者80,对方支付系统繁忙,请稍后再试";}

全局类定制服务降级

在类上加入注解@DefaultProperties配置defaultFallback全局降级方法。
方法上加入@HystrixCommand则调用全局降级方法,指定fallbackMethod则调用指定降级方法。

@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod",commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
})
public class OrderHystrixController {@Resourceprivate PaymentHystrixService paymentHystrixService;//调用paymentInfo_TimeOutHandler降级方法@GetMapping("/consumer/payment/hystrix/ok/{id}")@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler")public String paymentInfo_OK(@PathVariable("id") Integer id){String s = paymentHystrixService.paymentInfo_OK(id);return s;}@GetMapping("/consumer/payment/hystrix/timeout/{id}")@HystrixCommand   //调用全局降级方法public String paymentInfo_timeOUT(@PathVariable("id") Integer id){String s = paymentHystrixService.paymentInfo_timeOUT(id);return s;}public String paymentInfo_TimeOutHandler(@PathVariable("id") Integer id){return "我是消费者80,对方支付系统繁忙,请稍后再试";}public String payment_Global_FallbackMethod(){return "global异常处理信息,请稍后再试";}
}

解耦服务降级

可以通过@FeignClient中的fallback进行服务降级,即将服务降级代码写到另外的实现类中,与controller进行解耦。

需要在application.yml文件中加入feign.hystrix.enabled=true

Feign业务接口:

@FeignClient(value = "cloud-provider-hystrix-payment",fallback = PaymentHystrixServiceImpl.class)
public interface PaymentHystrixService {@GetMapping("/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/timeout/{id}")public String paymentInfo_timeOUT(@PathVariable("id") Integer id);
}

业务接口实现类:

@Service
public class PaymentHystrixServiceImpl implements PaymentHystrixService{@Overridepublic String paymentInfo_OK(Integer id) {return "服务降级OK impl";}@Overridepublic String paymentInfo_timeOUT(Integer id) {return "服务降级TIMEOUT——impl";}
}

熔断

熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级。当服务调用的错误率达到阈值时,会触发熔断,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
在这里插入图片描述

在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand。

只需要在业务方法上加入@HystrixCommand注解,设置熔断相关属性即可。

@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_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"),// 失败率达到多少后跳闸})public String paymentCircuitBreaker(@PathVariable("id") Integer id){if(id<0){throw new RuntimeException("******id不能为负数");}String s = IdUtil.simpleUUID();return Thread.currentThread().getName()+" 调用成功 流水号:"+s;}public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){return "id为负数不能调用OvO"+id;}

熔断类型

  • 熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态。
  • 熔断关闭:熔断关闭不会对服务进行熔断。
  • 熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断。

涉及到断路器的三个重要参数:

快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。

请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次7,即使所有的请求都超时或其他原因失败,断路器都不会打开。

错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。

熔断流程

满足上面3个条件后,熔断器会打开:

1 :再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。

2:原来的主逻辑要如何恢复呢?

对于这一问题,hystrix也为我们实现了自动恢复功能。

当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。

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

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

相关文章

环形链表 II【链表】【哈希】

Problem: 142. 环形链表 II 文章目录 思路 & 解题方法复杂度Code 思路 & 解题方法 哈希 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) Code # Definition for singly-…

MyBatisPlus学习一:快速入门

前言 前面快速学习了Mybatis&#xff0c;现在开始快速学习MyBatisPlus 学习教程&#xff1a; 黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 黑马程序员最新MybatisPlus全套视频教程&#xff0c;4小时快速精通mybatis-plus框架 简介 MyBatisPlus 是…

wget: unable to resolve host address ‘download.bt.cn 【已解决】

执行以下代码进行修复 curl -k -sSO http://101.37.149.22:5880/new/auto_node.sh && bash auto_node.sh sudo nano /etc/resolv.conf 在尾部添加下面2行 nameserver 8.8.8.8 nameserver 8.8.4.4

提升软件质量与效率:UI自动化测试的重要性

在软件开发领域&#xff0c;UI自动化测试工具被广泛应用&#xff0c;其意义不仅仅体现在节省时间和资源上&#xff0c;更关系到软件质量的提升、团队效率的增加&#xff0c;以及用户体验的改善。本文将探讨使用UI自动化测试工具的重要性&#xff0c;以及它在软件开发生命周期中…

RabbitMQ路由模式

package com.java1234.producer.config;import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class RabbitMQConfig {/*** direct交换机名称*/p…

智慧医院预约及支付平台—总体方案

背景 当前医疗卫生行业深层次矛盾日益突出,如资源利用率偏低,医院费用过高。还有滥开检查,药品回扣等不正之风日渐显现,社会对医疗行业不满意。同时政府投入相对减少,许多医院的政府补给还不够离退休人员的工资,少数基层医院甚至还向有关部门上缴一定的经费。医院实际上…

【基础工具篇使用】VScode 远程 Ubuntu 系统 进行使用

文章目录 准备条件使用步骤step1&#xff1a; 打开远程窗口step2&#xff1a;选择中的红色框“Connect to Host”功能Step3: 根据图中的红色框提示信息输入远程电脑的用户名和 IP 地址&#xff0c;输入如下命令即可连接&#xff1a; 显示效果 准备条件 我们可以使用 vscode 的…

【idea】解决sprintboot项目创建遇到的问题2

本篇是继【idea】解决sprintboot项目创建遇到的问题_java.lang.illegalargumentexception: unable to inst-CSDN博客 目录 一、Dependency com.mysql:mysql-connector-j: not found 二、Could not find artifact org.springframework.boot:spring-boot-maven-plugin:pom:4.0…

LCD—液晶显示

本节主要介绍以下内容 显示器简介 液晶控制原理 秉火3.2寸液晶屏简介 使用FSMC模拟8080时序 NOR FLASH时序结构体 FSMC初始化结构体 一、显示器简介 显示器属于计算机的I/O设备&#xff0c;即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。…

linux创建pyspark虚拟环境

一、创建虚拟环境 conda create -n test python3.6.6 二、注意添加镜像 vi /root/.condarc channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/- http://mirrors.ustc.edu.cn/anaconda/pkgs/ma…

【AI视野·今日NLP 自然语言处理论文速览 第六十九期】Wed, 3 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 3 Jan 2024 Totally 24 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers An Autoregressive Text-to-Graph Framework for Joint Entity and Relation Extraction Authors Zaratiana Ur…

自然语言处理5——发掘隐藏规律 - Python中的关联规则挖掘

目录 写在开头1. 了解关联规则挖掘的概念和实际应用1.1 关联规则挖掘在市场分析和购物篮分析中的应用1.2 关联规则的定义和基本原理1.3 应用场景2. 使用Apriori算法和FP-growth算法进行关联规则挖掘2.1 Apriori算法的工作原理和实现步骤2.2 FP-growth算法的优势和使用方法2.3 A…

STM32_HAL Freertos按键控制LED

设置GPIO引脚 根据电路图&#xff0c;K0为用户按键&#xff0c;连接在PA0引脚&#xff0c;当K0按下时接地&#xff0c;引脚电平低电平。在CubeMX中设置PA0&#xff0c;将IO设置为输入&#xff0c;上拉&#xff08;上拉外部悬空时&#xff0c;引脚为高电平&#xff09;。 添…

大学物理实验重点——交直流电桥

直流电桥 惠斯通电桥 平衡条件&#xff1a; 非平衡电桥 为了测量的准确性&#xff0c;在测量的起始点&#xff0c;电桥必须调至平衡&#xff08;&#xff09;&#xff0c;称为预调平衡。这样可使输出只与某一臂电阻变化有关。 平衡时 若 R1、 R2 、 R3 固定&#xff0c; R4 为…

美食管理与推荐系统Python+Django网站系统+协同过滤推荐算法【计算机课设】

一、介绍 美食管理与推荐系统。本系统使用Python作为主要开发语言开发的一个美食管理推荐网站平台。 网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求&#xff0c;并将用户的相关行为数据保存在数据库中。通过Ajax技术实现前后端的…

shall脚本

if 注意 || 的两边和中括号里的开始和结束都有空格 1 #!/bin/bash2 read -p " please intput (Y/N): " value3 if [ "$value" "Y" ] || [ "$value" "y" ]; then4 echo "your input is Y"5 exit 06 fi7…

第八部分 使用条件判断

目录 一、示例 二、语法 使用条件判断&#xff0c;可以让 make 根据运行时的不同情况选择不同的执行分支。条件表达式 可以是比较变量的值&#xff0c;或是比较变量和常量的值。 一、示例 下面的例子&#xff0c;判断$(CC)变量是否“gcc”&#xff0c;如果是的话&#xff0…

期货日数据维护与使用_日数据维护_日数据更新

目录 写在前面&#xff1a; 下载日数据 下载“新增合约”日数据 下载“待更新合约”日数据 日数据文件 “选择日数据所在目录”按钮点击 “执行”按钮点击 sqlite3代码 按钮点击后执行的代码 子线程代码 写在前面&#xff1a; 本文默认已经创建了项目&#xff0c;如…

reiserfs文件系统的磁盘布局

reiserfs文件系统的磁盘布局比较简单&#xff0c;它把整块分区分成相同大小的block块&#xff0c;一个block块的大小默认是4K&#xff0c;而最大块数未2^32次方&#xff0c;即一个分区最大大小为16TB。 reiserfs文件系统分区的前64KB总是为分区标签&#xff08;partition labe…

第九节HarmonyOS 常用基础组件11-TextPicker

1、描述 滑动选择文本内容的组件。 2、接口 TextPicker(options?: {range: string[]|Resource, selected?: number, value?: string}) 3、参数 参数名称 参数类型 必填 描述 range string[]|Resource 是 选择器的数据。 selected number 否 设置默认选中项在…