• Spring Cloud Netflix子模块综合整理-Hystrix


    这篇博客主要整理

    1.断路器:Hystrix客户端

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

                          (微服务Hystrix仪表盘样例)

    较低级别的服务中的服务故障可能导致级联故障一直到用户。 当对特定服务的调用大于circuitBreaker.requestVolumeThreshold(默认值:20个请求)并且在由metrics.rollingStats.timeInMilliseconds定义的滚动窗口中,failue百分比大于circuitBreaker.errorThresholdPercentage(默认值:> 50%)(默认值:10秒) 电路打开,不进行调用。在错误和开放电路的情况下,开发人员可以提供一个退路【即开发人员提供服务降级】。

    Hystrix回退可防止级联故障

    开放式电路可以阻止级联故障,并且可以让不堪重负或失败的服务时间得到治愈。 后备可以是另一个受Hystrix保护的调用,静态数据或理智的空值。 回退可能会被链接,因此第一个回退会使一些其他业务调用反过来又回到静态数据。

    1.1如何添加Hystrix

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

    具体实例:

    @SpringBootApplication
    //开起断路器
    @EnableCircuitBreaker
    public class Application {
    
    public static void main(String[] args) {
       new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
    }
    @Component
    public class StoreIntegration {
       //fallbackMethod中定义服务降级方法,此方法和正常调用方法参数必须一致
       @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 */;
       }
    }

    @HystrixCommand由名为“javanica”的Netflix contrib库提供【com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand】。 Spring Cloud在连接到Hystrix断路器的代理中自动包装带有该注释的Spring bean。 断路器计算何时打开和关闭电路,以及在发生故障时该怎么做。

    要配置@HystrixCommand,可以将commandProperties属性与@HystrixProperty注释列表一起使用.

    例如:

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

    //配置服务降级和线程隔离策略
    @HystrixCommand(fallbackMethod = "stubMyService",
    commandProperties = {
      @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
      }
    )

    1.2健康指示器

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

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

    1.3Hystrix指标流

    要启用Hystrix度量标准流,需要添加spring-boot-starter-actuator。 这会将/hystrix.stream公开为管理端点。访问后返回json数据,浏览器不断刷新以获取实时的监控数据。

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

    2.断路器:Hystrix仪表板

    Hystrix的主要优点之一是它收集的关于每个HystrixCommand的指标集。 Hystrix仪表板以高效的方式显示每个断路器的运行状况。

    具体样例如上

    Hystrix超时和Ribbon客户端

    使用包装Ribbon客户端的Hystrix命令时,您需要确保Hystrix超时被配置为比配置的Ribbon超时要长,包括可能进行的任何潜在重试。例如,如果您的Ribbon连接超时是1秒,而Ribbon客户端可能会重试三次请求,那么Hystrix超时应该略多于3秒。

    2.1如何添加Hystrix仪表板

    <!--引入hystrix dashboard(仪表盘)-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
    </dependency>

    要运行Hystrix仪表板,要在SpringBoot主类上添加@EnableHystrixDashboard注解启用仪表板。 然后,您访问/hystrix并将仪表板指向Hystrix客户端应用程序中的单个实例/hystrix.stream端点。如下:

    注意:

    连接到使用HTTPS的/hystrix.stream端点时,JVM必须信任服务器使用的证书。 如果证书不可信,则必须将证书导入JVM,以便Hystrix仪表板生成成功连接到流端点。

    2.2Turbine

    查看单个实例,Hystrix数据在系统整体运行状况方面不是很有用。 Turbine是一个应用程序,它将所有相关的/hystrix.stream端点聚合到一个组合的/turbine.stream中,以便在Hystrix仪表板中使用。 个别实例位于Eureka。启动Turbine需要在SpringBoot主类添加@EnableTurbine,还需要引入相关的maven依赖。

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

    turbine.appConfig是配置一个eureka服务的列表,turbine将使用它来查找实例。然后使用类似于以下内容的URL在Hystrix仪表板中使用turbine:http://my.turbine.sever:8080 / turbine.stream?cluster = CLUSTERNAME(如果名称为“default”,则可以省略cluster参数)[如下图访问http://ip:port/hystrix,url中输入http://ip:port/turbine.stream]。群集参数必须与turbine.aggregator.clusterConfig一致。turbine.aggregator.clusterConfig配置必须为大写

    turbine:
    aggregator:
    clusterConfig: CUSTOMERS
    //配置需要监控的服务名,多个用逗号隔开
    appConfig: customers

    clusterName可以通过Turb.clusterNameExpression中的SPEL表达式进行自定义,默认值为appName。

    要为所有应用程序使用“默认”群集,您需要一个字符串文字表达式(带单引号,如果它也在YAML中,则使用双引号进行转义)

    application.yaml

    turbine:
      appConfig: customers,stores
      clusterNameExpression: "'default'"

    2.2Turbine Stream(基于消息队列)

    在某些环境中,从所有分布式Hystrix命令中提取度量标准的经典Turbine模型不起作用[如微服务与Turbine网路不同]。 在这种情况下,您可能希望让Hystrix命令将指标推送到Turbine,而Spring Cloud通过消息传递实现这一点。 您需要在客户端上执行的操作是为spring-cloud-netflix-hystrix-stream和您选择的spring-cloud-starter-stream- *添加相关消息带来依赖,如rabbitmq和kafka。

    在服务器端只需创建一个Spring Boot应用程序并使用@EnableTurbineStream进行注释,默认情况下它将出现在端口8989上(将您的Hystrix仪表板指向该端口,任何路径)。 您可以使用server.port或turbine.stream.port自定义端口。 如果在类路径上也有spring-boot-starter-web和spring-boot-starter-actuator,那么你可以打开执行器通过提供不同的management.port,在单独的端口(默认情况下使用Tomcat)上的端点[即通过设置management.port提供单独的访问端口,供仪表板访问]。然后,您可以将Hystrix仪表板指向Turbine Stream Server而不是单独的Hystrix流。 如果Turbine Stream在myhost上的端口8989上运行,则将http:// myhost:8989放入Hystrix仪表板的流输入字段中。

    Spring Cloud提供了spring-cloud-starter-netflix-turbine-stream,它具有运行Turbine Stream服务器所需的所有依赖关系 - 只需添加您选择的Stream绑定器,例如: spring-cloud-starter-stream-rabbit。 您需要Java 8来运行应用程序,因为它是基于Netty的。

     微信公众号

     

     

  • 相关阅读:
    iOS9 News 应用
    swift中,Optional、?与!之间的关系
    [翻译] CotEditor
    [book] iOS 8 Swift Programming Cookbook
    便利的操作plist文件
    消除 Xcode7 中 directory not found for option 'xxxx' 警告
    点击单个cell高度变化的动画效果
    [翻译] LiquidFloatingActionButton
    一脸懵逼学习Zookeeper(动物园管理员)---》高度可靠的分布式协调服务
    一脸懵逼学习基于CentOs的Hadoop集群安装与配置(三台机器跑集群)
  • 原文地址:https://www.cnblogs.com/niugang0920/p/12190330.html
Copyright © 2020-2023  润新知