Hystrix使用及其配置详解

简介: Hystrix使用及其配置详解

目录


1、简介


2、正文


2.1 Hystrix使用场景


2.2 Hystrix处理异常


2.3 Hystrix处理超时


2.4 Hystrix断路器阈值设置


2.5 Hystrix与Fegin集成


1、简介

在微服务中,服务与服务之间的调用经常出现两个不确定性因素:


网络延迟

服务异常

延迟在微服务中是一个非常重要的性能指标,随着服务的增加,调用链越来越复杂,此时低延迟往往是微服务系统架构中首要目标;高网络延迟可能会拖垮整个微服务,这是不允出现的。此外服务内部可能会发生未知异常,或者未捕获的异常,这时异常如果没有得到正确的处理,将会沿着调用链往上抛出,这对上传调用链来说也是致命的,因为往往这个时候上层调用方它不知道该如何处理未知异常。

对于服务异常,我们应该在系统架构时满足维加斯规则(Vegas Rule):在微服务中发生的事情,就留在该微服务中。通俗点说,微服务中发生的异常要自己处理,不应该给其他微服务返回非约定交互报文之外的任何信息。

对于网络延迟,这是无法避免的,CAP理论中也谈到过分布式架构中网络分区无法避免,用于可能发生;因此我们只能在可能发生网络延迟的地方,做超时设置、超时后的副本处理等操作。


Hystrix用于解决上面两个问题。(注意,它并不能让错误不发生或者让网络延迟不发生,它只是提供了后备行为和自校正功能,可以用于优雅的处理错误和网络延迟。)Hystrix的工作原理很简单,被保护的方法可以设定失败阈值,在给定的失败阈值内方法发生失败(异常/延迟),通过调用一个预先准备的后备方法来返回预先准备的数据报文(本质上仍然是通过切面实现)。Hystrix有三种状态,分别是关闭状态、打开状态、半开状态。


关闭状态(closed),Hystrix默认为关闭状态

打开状态(open),超过设定的失败阈值后,熔断机制打开,Hystrix进入打开状态,此时所有请求直接请求提供熔断方法,不再请求正常服务

半开状态(half open),Hystrix进入打开状态之后,超过circuitBreaker.sleepWindowInMilliseconds时间周期,Hystrix进入半打开状态,此时尝试调用正常服务,如果服务调用失败会重置为失败状态

image.png2、正文

2.1 Hystrix使用场景

Hystrix多用于有网络延时的场景,因此其使用场景也是那些容易出现网络延迟的方法,比如说:


远程服务调用,rest请求

数据库访问

复杂且耗时的计算场景

2.2 Hystrix处理异常

Hystrix用于微服中,因此使用Hystrix之前,需要准备一个简单的微服务环境,指定Spring Cloud版本和Spring Boot版本,此外引入web依赖用于模拟微服务间调用。image.pngimage.png方法一:

编写使用Hystrix保护的方法,这里使用@HystrixCommand注解注释需要受Hystrix保护的方法,并且指定fallbackMethod属性的值为fallback,fallback是一个提前预置的方法,该方法与受保护的方法返回值一致,用于服务断路器打开时备用。我在demo方法中,直接抛出了一个RuntimeException,模拟服务调用失败。

image.png方法二:

除了上面这种直接在方法指定后备方法之外,还可以采用另外一种方法,直接在Controller类上定义默认的后备方法,这样整个Controller需要受保护的方法,无需每个都明确指定后备方法了。(区别:@HystrixCommand无需再指定fallbackMethod)image.png2.3 Hystrix处理超时

Hystrix除了能优雅的处理未知异常之外,其另外一个能力就是方法执行延迟的处理, @HystrixCommand注解默认情况下设置了1秒的超时时间,如果1秒内方法未返回,将会执行预置的后备方法。1秒的超时时间不一定满足所有的业务场景,或者有些方法它就是硬不要设置超时时间,关于这些需求Hystrix都提供了相应的配置项。


@HystrixCommand注解中提供了commandProperties属性,它是一个HystrixProperty数组,因此@HystrixProperty可以定义多个;其中name指定要配置的项,value指定对应配置项的值。image.png接口并未返回Hello!,而是返回了后备方法的返回值Timeout!,这是因为我们设值的超时时间是2秒,而 TimeUnit.SECONDS.sleep(3)睡眠了3秒,导致熔断器打开,返回了后备方法。image.pngimage.png

Hystrix的方法超时时间也可以关闭,@HystrixProperty提供了关闭的开关如下所示:

@RestController
@RequestMapping("/closeTimeout")
public class TimeoutDisableController {
    @GetMapping
    @HystrixCommand(
            fallbackMethod = "fallback",
            commandProperties = {
                    @HystrixProperty(
                            name = "execution.timeout.enabled",
                            value = "false"
                    )
            })
    public ResponseEntity<String> demo() {
        try {
            // 模拟接口请求
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new ResponseEntity<>("Hello!", HttpStatus.OK);
    }
    private ResponseEntity<String> fallback() {
        return new ResponseEntity<>("Timeout!", HttpStatus.OK);
    }
}

image.png

@RestController
@RequestMapping("/circuitBreaker")
public class CircuitBreakConfigController {
    @GetMapping
    @HystrixCommand(
            fallbackMethod = "fallback",
            commandProperties = {
                    @HystrixProperty(
                            name = "execution.isolation.thread.timeoutInMilliseconds",
                            value = "1000"
                    ),
                    @HystrixProperty(
                            name = "circuitBreaker.requestVolumeThreshold",
                            value = "4"
                    ),
                    @HystrixProperty(
                            name = "circuitBreaker.errorThresholdPercentage",
                            value = "50"
                    ),
                    @HystrixProperty(
                            name = "metrics.rollingStats.timeInMilliseconds",
                            value = "60000"
                    ),
                    @HystrixProperty(
                            name = "circuitBreaker.sleepWindowInMilliseconds",
                            value = "60000"
                    )
            })
    public ResponseEntity<String> demo() {
        try {
            // 模拟接口请求
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new ResponseEntity<>("Hello!", HttpStatus.OK);
    }
    private ResponseEntity<String> fallback() {
        return new ResponseEntity<>("Timeout!", HttpStatus.OK);
    }
}

image.pngimage.pngimage.pngimage.png

目录
相关文章
|
10月前
SpringCloud极简入门-Feign开启Hystrix
1.支付服务集成Hystrix 官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/single/spring-cloud.html#spring-cloud-feign-hystrix 支付服务 springcloud-pay-server-1040 之前集成了Feign,修改该工程集成Hystrix。我们除了要给Feign开启Hystrix以外还需要为Feign接口编写托底类。
106 0
|
1月前
Springcloud-ribbon和hystrix配置
Springcloud-ribbon和hystrix配置
8 0
|
7月前
|
监控 Java 微服务
16SpringCloud - 断路器项目示例(Hystrix Dashboard)
16SpringCloud - 断路器项目示例(Hystrix Dashboard)
26 0
|
7月前
|
Java Spring
15SpringCloud - 断路器项目示例(Feign Hystrix)
15SpringCloud - 断路器项目示例(Feign Hystrix)
19 0
|
7月前
|
监控 Java
14SpringCloud - 断路器项目示例(Ribbon Hystrix)
14SpringCloud - 断路器项目示例(Ribbon Hystrix)
23 0
|
10月前
|
SpringCloudAlibaba 双11 Sentinel
七.SpringCloudAlibaba极简入门-Sentinel熔断
在上一章节我们探讨了Sentinel的流控(限流)功能,Sentinel除了流控还提供了服务熔断和降级机制,服务之间的调用关系错综复杂,微服务的调用链上的某些服务资源不稳定(宕机,异常,超时)可能会导致可能请求的失败和请求的堆积,调用链产生连锁反应可能会导致整个微服务架构瘫痪。服务熔断降级机制是保障高可用的重要措施之一。
|
10月前
|
存储 缓存 监控
SpringCloud极简入门-熔断器Hystrix
在电影里面经常出现的场景,在冰山雪地不要大声呼喊,因为声音的震动会导致雪球的滑落,然后引起连锁反应导致整个雪山的崩塌这就是生活中的雪崩。在微服务里面也是一样,服务的调用非常复杂的 ,一个请求往往需要很多的微服务共同完成,可能会形成很长的服务调用链,在整个服务调用链中,某一个服务发生故障会导致调用它的服务跟着异常,然后导致整个调用链调用的异常,甚至导致整个微服务瘫痪 , — 这就是雪崩效应。
211 0
|
负载均衡 Java Nacos
spring cloud负载均衡--Ribbon
spring cloud负载均衡--Ribbon
100 0
spring cloud负载均衡--Ribbon
|
SpringCloudAlibaba 负载均衡 Java
SpringCloud Alibaba学习(十):Sentinel的服务熔断功能(Sentinel整合Ribbon+OpenFeign+fallback)
SpringCloud Alibaba学习(十):Sentinel的服务熔断功能(Sentinel整合Ribbon+OpenFeign+fallback)
217 0
SpringCloud Alibaba学习(十):Sentinel的服务熔断功能(Sentinel整合Ribbon+OpenFeign+fallback)
|
监控 Java Spring
15、Feign整合断路器监控Hystrix Dashboard
本篇讲解一下Feign如何整合断路器监控Hystrix Dashboard。本篇主要整合sc-eureka-client-consumer-feign-hystrix项目和sc-hystrix-dashboard项目。
166 0
15、Feign整合断路器监控Hystrix Dashboard