0502-Hystrix保护应用-简介,使用,健康指标等

一、概述

参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_circuit_breaker_hystrix_clients

源码wiki:https://github.com/Netflix/Hystrix/wiki

Netflix创建了一个名为Hystrix的库,实现断路器模式。在微服务体系结构中,通常有多层服务调用。

较低级别的服务中的服务故障可能导致级联故障直至用户。当对特定服务的调用大于CurrBurnReal.RealStestMultRESHOLD(默认值:20请求)和故障率大于TraceBurror.Error阈值百分比(默认值:50%)在MultICC.LoLink StutsTimeMimLimeDS(默认值:10秒)定义的滚动窗口中,电路断开,不进行调用。在发生错误和开路的情况下,开发者可以提供fallback。

0502-Hystrix保护应用-简介,使用,健康指标等

开放的电路可以防止级联失败,并允许服务自我恢复。回退可以是Hystrix另一个受保护的调用,静态数据或一个空值。回退可能会是链,因此第一次回退会导致其他业务呼叫转而回退到静态数据。

二、使用

2.1、hystrix-javanica简介

源码地址:https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica

与其他语言(如反射和注释)相比,Java语言具有很大的优势。所有现代框架,如Spring,Hibernate,myBatis等都力求最大限度地利用这些优势。在Hystrix中引入注释的想法是改进的明显解决方案。目前使用Hystrix涉及编写大量代码,这是快速开发的障碍。您可能花费大量时间编写Hystrix命令。通过引入支持注释,Javanica项目的构想更容易使用Hystrix。

简化了Hystrix使用

2.2、使用

@HystrixCommand由一个名为“javanica”的Netflix contrib库提供。Spring Cloud会自动将带有该注释的Spring bean包装在连接到Hystrix断路器的代理中。断路器计算何时打开和关闭电路,以及在发生故障时应采取的措施。

要配置@HystrixCommand,您可以使用带有@HystrixProperty注释列表的commandProperties属性

pom引用

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

启动类增加如下注解

@EnableCircuitBreaker

在调用方法增加注解以及fallback方法

@Component
public class StoreIntegration {

    @HystrixCommand(fallbackMethod = "<strong>defaultStores</strong>")
    public Object getStores(Map<String, Object> parameters) {
        //do stuff that might fail
    }

    <strong>public Object defaultStores(Map<String, Object> parameters) {
        return /* something useful */</strong><strong>;
    }</strong>
}

注意点:

1、fallbackMethod 必须是定义的方法

2、defaultStores 方法参数返回值与注解HystrixCommand标记的一致

3、在发生问题后,会经过defaultStores处理。

三、其他

3.1、传播安全上下文或使用Spring Scopes

如果你想要一些线程本地上下文传播到@HystrixCommand,默认声明将不起作用,因为它在线程池中执行命令(在超时的情况下)。您可以使用某种配置将Hystrix切换为与调用方使用相同的线程,或者直接在注释中请求它使用不同的“隔离策略”。

参看地址:https://github.com/Netflix/Hystrix/wiki/Configuration#command-properties

execution.isolation.strategy:该属性指示HystrixCommand.run()执行的隔离策略,以下两种选择之一:

THREAD - 它在单独的线程上执行,并发请求受线程池中线程数的限制

SEMAPHORE - 它在调用线程上执行,并发请求受信号计数限制

缺省值和建议的设置是使用线程隔离(THREAD)和使用信号量隔离(SEMAPHORE)的HystrixObservableCommands运行HystrixCommands。

使用在对应的方法上增加

@HystrixCommand(fallbackMethod = "findByIdFallback", commandProperties = @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"))

如果使用@SessionScope或@RequestScope,则同样适用。您将知道何时需要执行此操作,因为运行时异常表示无法找到范围内的上下文。

【1.2开始】您也可以选择将hystrix.shareSecurityContext属性设置为true。这样做会自动配置一个Hystrix并发策略插件钩子,他可以将SecurityContext从主线程传输到Hystrix命令使用的钩子。Hystrix不允许注册多个hystrix并发策略,因此通过将自己的HystrixConcurrencyStrategy声明为Spring bean,可以使用扩展机制。Spring Cloud将在Spring上下文中查找您的实现,并将其包装在自己的插件中。【一般是出异常,出问题才需配置】

参看文章:https://github.com/spring-cloud/spring-cloud-netflix/issues/1330,https://github.com/spring-cloud/spring-cloud-netflix/issues/1336

3.1.1、Scope

Scope描述的是Spring容器如何新建Bean实例的。Spring的Scope有以下几种,通过@Scope注解来实现。

(1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。

(2)Prototype:每次调用新建一个Bean实例。

(3)Request:Web项目中,给每一个 http request 新建一个Bean实例。

(4)Session:Web项目中,给每一个 http session 新建一个Bean实例。

(5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。

3.2、健康指标

连接断路器的状态也暴露在呼叫应用程序的/ health端点中。

访问地址:http://localhost:8761/health

可查看如下

{
    "hystrix": {
        "openCircuitBreakers": [
            "StoreIntegration::getStoresByLocationLink"
        ],
        "status": "CIRCUIT_OPEN"
    },
    "status": "UP"
} 

此时可以断掉服务提供方,稍后查看

断路器打开

其中health的查看,需要添加

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

3.3、Hystrix度量流

启用Hystrix指标流包括对弹簧启动启动器执行器的依赖。这会将/hystrix.stream公开为管理端点。访问具体接口,能够查看消息

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

后期可以使用Dashboard查看

同样Feign也支持Hystrix

相关推荐