首页 > 编程知识 正文

熔断策略,hystrix如何实现熔断

时间:2023-05-04 20:23:54 阅读:12783 作者:894

文章目录1 .创始人文件2 .熔断机制3 .原理总结4 .断路器开启后5 .服务监控hystrixDashboarda .七色b .一圈c .一线d .单图说明e .多图说明

1 .创业文档

大神文档

2 .熔断机构熔断机构概要

熔断机制是应对雪崩效应的微服务链路保护机制。 如果扇出链路上的微服务因错误而不可用,或者响应时间过长,

进行服务降级,进而熔断该节点的微服务调用,快速返回错误的响应消息。

如果检测到此节点的微服务呼叫响应正常,则重新启动呼叫链路。

在Spring Cloud框架中,熔断机制由Hystrix实现。 Hystrix监视微服务间呼叫的状况,

当失败的调用达到一定阈值时,缺省情况下,5秒内20次调用失败,熔断机制启动。 熔断机制注释为@HystrixCommand

3 .原理总结

官方网站断路器流程图

4 .断路器进入后,1 :如果有更多调用请求,则不会调用主逻辑,而是直接调用降级到故障恢复。 通过断路器,实现了自动发现错误,将简并逻辑切换为主逻辑,减少响应延迟的效果。

2 )原始的主逻辑如何恢复呢?

对于这个问题,hystrix也为我们提供了自动恢复功能。

当断路器打开并熔断主逻辑时,hystrix将启动休眠时间窗口。 在该时间窗口内,降级逻辑临时变为主逻辑。

休眠时间窗口关闭后,断路器将变为半开状态,将请求释放到原始主逻辑,如果此次请求恢复正常,断路器将继续关闭。

如果主逻辑恢复,并且这次请求仍然有问题,断路器将继续进入打开状态,休眠时间窗将重新计时。

@HystrixCommand的所有配置

//=======================all @ hystrixcommand (fallback method=' str _ fallback method ',grourd ) 设置THREADPoolKey='strThreadPool ',commandProperties={ //隔离策略, thread是线程池semaphore:value=' thread ' (表示信号池隔离@ hystrixproperty (name=' exececcaphore ) ),//通过隔离策略选择信号池隔离信号池大小(最大并发行数) hystrixproperty name=' execution.isolation.semaphore.maxconne//配置命令执行超时时间@ hystrixproperty (name=' execution.isolation.thread.timeoutinmilliseconds ', value='10 ' )、//是否启用超时时间@ hystrixproperty (name=' execution.time out.enabled ', value='true ' )、//执行超时时@ hystrixproperty (name=' execution.isolation.thread.interruptontimeout ', 是否中断value='true ',//在取消执行时@ hystrixproperty (name=' execution.isolation.thread.interruptoncancel ' ) 是否中断value='true '或允许执行//回调方法的最大并发数@ hystrixproperty (name=' fallback.isolation.semaphore.maxconnent ) value='10 ' )、//回调函数@ hystrixproperty (name=' fallback.enabled ',value='true ' )、//是否启用断路器

// 该属性用来设置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为 20 的时候, // 如果滚动时间窗(默认10秒)内仅收到了19个请求, 即使这19个请求都失败了,断路器也不会打开。 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"), // 该属性用来设置在滚动时间窗中,表示在滚动时间窗中,在请求数量超过 // circuitBreaker.requestVolumeThreshold 的情况下,如果错误请求数的百分比超过50, // 就把断路器设置为 "打开" 状态,否则就设置为 "关闭" 状态。 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"), // 该属性用来设置当断路器打开之后的休眠时间窗。 休眠时间窗结束之后, // 会将断路器置为 "半开" 状态,尝试熔断的请求命令,如果依然失败就将断路器继续设置为 "打开" 状态, // 如果成功就设置为 "关闭" 状态。 @HystrixProperty(name = "circuitBreaker.sleepWindowinMilliseconds", value = "5000"), // 断路器强制打开 @HystrixProperty(name = "circuitBreaker.forceOpen", value = "false"), // 断路器强制关闭 @HystrixProperty(name = "circuitBreaker.forceClosed", value = "false"), // 滚动时间窗设置,该时间用于断路器判断健康度时需要收集信息的持续时间 @HystrixProperty(name = "metrics.rollingStats.timeinMilliseconds", value = "10000"), // 该属性用来设置滚动时间窗统计指标信息时划分"桶"的数量,断路器在收集指标信息的时候会根据 // 设置的时间窗长度拆分成多个 "桶" 来累计各度量值,每个"桶"记录了一段时间内的采集指标。 // 比如 10 秒内拆分成 10 个"桶"收集这样,所以 timeinMilliseconds 必须能被 numBuckets 整除。否则会抛异常 @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10"), // 该属性用来设置对命令执行的延迟是否使用百分位数来跟踪和计算。如果设置为 false, 那么所有的概要统计都将返回 -1。 @HystrixProperty(name = "metrics.rollingPercentile.enabled", value = "false"), // 该属性用来设置百分位统计的滚动窗口的持续时间,单位为毫秒。 @HystrixProperty(name = "metrics.rollingPercentile.timeInMilliseconds", value = "60000"), // 该属性用来设置百分位统计滚动窗口中使用 “ 桶 ”的数量。 @HystrixProperty(name = "metrics.rollingPercentile.numBuckets", value = "60000"), // 该属性用来设置在执行过程中每个 “桶” 中保留的最大执行次数。如果在滚动时间窗内发生超过该设定值的执行次数, // 就从最初的位置开始重写。例如,将该值设置为100, 滚动窗口为10秒,若在10秒内一个 “桶 ”中发生了500次执行, // 那么该 “桶” 中只保留 最后的100次执行的统计。另外,增加该值的大小将会增加内存量的消耗,并增加排序百分位数所需的计算时间。 @HystrixProperty(name = "metrics.rollingPercentile.bucketSize", value = "100"), // 该属性用来设置采集影响断路器状态的健康快照(请求的成功、 错误百分比)的间隔等待时间。 @HystrixProperty(name = "metrics.healthSnapshot.intervalinMilliseconds", value = "500"), // 是否开启请求缓存 @HystrixProperty(name = "requestCache.enabled", value = "true"), // HystrixCommand的执行和事件是否打印日志到 HystrixRequestLog 中 @HystrixProperty(name = "requestLog.enabled", value = "true"), }, threadPoolProperties = { // 该参数用来设置执行命令线程池的核心线程数,该值也就是命令执行的最大并发量 @HystrixProperty(name = "coreSize", value = "10"), // 该参数用来设置线程池的最大队列大小。当设置为 -1 时,线程池将使用 SynchronousQueue 实现的队列, // 否则将使用 LinkedBlockingQueue 实现的队列。 @HystrixProperty(name = "maxQueueSize", value = "-1"), // 该参数用来为队列设置拒绝阈值。 通过该参数, 即使队列没有达到最大值也能拒绝请求。 // 该参数主要是对 LinkedBlockingQueue 队列的补充,因为 LinkedBlockingQueue // 队列不能动态修改它的对象大小,而通过该属性就可以调整拒绝请求的队列大小了。 @HystrixProperty(name = "queueSizeRejectionThreshold", value = "5"), })public String strConsumer() { return "hello 2020";}public String str_fallbackMethod(){ return "*****fall back str_fallbackMethod";}



5.服务监控hystrixDashboard


a.七色



b.一圈

实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。
该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。


c.一线

曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。


d.单个图说明


e.多个图说明

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。