• 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。

      

      开放的电路可以防止级联失败,并允许服务自我恢复。回退可以是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属性

    1、pom引用

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

    2、启动类增加如下注解

    @EnableCircuitBreaker

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

    @Component
    public class StoreIntegration {
    
        @HystrixCommand(fallbackMethod = "defaultStores")
        public Object getStores(Map<String, Object> parameters) {
            //do stuff that might fail
        }
    
        public Object defaultStores(Map<String, Object> parameters) {
            return /* something useful */;
        }
    }

    注意点:

    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/1330https://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

    代码地址:https://github.com/bjlhx15/spring-cloud/tree/master/microservice-comsumer-movie-ribbon-with-hystrix 

  • 相关阅读:
    Eclipse下配置javaweb项目快速部署到tomcat
    SpringMVC中如何在网站启动、结束时执行代码(详细,确保可用)
    # 浏览器兼容性 小结
    # HTML && CSS 学习笔记
    # li鼠标移入移出,点击,变背景色,变checkbox选中状态
    SpringMVC开发入门讲义
    Spring同mybatis整合讲义(事物)
    Spring中的AOP开发
    Spring框架IOC,DI概念理解
    Mybatis里SQL语句的分页
  • 原文地址:https://www.cnblogs.com/bjlhx/p/8903838.html
Copyright © 2020-2023  润新知