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

 微信公众号

 

 

原文地址:https://www.cnblogs.com/niugang0920/p/12190330.html