Hystrix 重要概念和使用
分布式系统下,处理某个业务功能时,通常是存在服务调用链路的,即可能存在服务 A 调用服务 B,服务B调用服务C,从而完成一个服务。
如果只是调用链路中的某个微小服务不可用了,都可能导致整个业务功能无法提供服务。
Hystrix 能做什么?
而 Hystrix 框架能做服务降级、服务熔断和进行实时监控。
Hystrix 是什么?
Hystrix 是一个用于处理分布式系统的延迟和容错的开源库, 在分布式系统里,许多服务不可避免的会调用失败,比如超时、异常等,Hystrix 能够保证在一个服务出问题的情况下, 不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),**向调用方返回-个符合预期的、可处理的备选响应(FallBack) ,而不是长时间的等待或者抛出调用方无法处理的异常,**这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
服务降级(fallback)
服务降级是指给出现不可用的服务一条退路,不会因为该服务的不可用而导致服务调用链一直停留在此地。(假设某个服务不可用了,此时客户端可以自己准备一个本地的 fallback 回掉,返回一个缺省值,这样做,虽然服务水平下降,但好歹,比直接挂掉要强。
服务降级处理是在客户端实现完成的,与服务端没有关系。)
如我们常见的退路(fallback)是:服务器忙,请稍候再试,不让客户端长时间等待并立刻返回一个友好提示。
哪些情况下会触发降级?
- 服务运行异常
- 服务响应超时
- 服务熔断触发服务降级
- 线程池/信号量打满导致服务降级
服务熔断(break)
服务熔断是类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,之后的所有访问请求都会调用服务降级的方法并返回友好提示。
服务不能用 -> 服务降级 -> 进而熔断 -> 恢复调用链路
服务限流(flowlimit)
服务限流是指在秒杀高并发等场景中,把所有的访问请求排序,每秒钟只允许N个访问请求进入,有序的处理请求。
Hystrix 的服务降级功能怎么用(在服务客户端配置)
1、给每一个方法添加自己的降级方法
- 在主启动类上添加 @EnableCircuitBreaker 注解
- 在需要做服务降级的方法上添加 @HystrixCommand 注解(被服务降级的方法是 Controller 层的方法)
- 然后创建 fallbackMethod 属性所规定的降级方法,在降级方法内做友好提示等。步骤二的代码表示只要该指定方法耗时超过 3 秒,则会立刻执行降级方法。(程序出异常等,也可以直接使用上述代码做服务降级,而不用修改 @HystrixProperty 注解指定的类。)
2、给所有方法统一添加全局的降级方法(防止代码膨胀)
- 给 service 层的接口新建一个 fallback 实现类,然后给 service 层接口添加如下类注解:
- 编写 fallback 实现类代码:(这样每一个 service 层都有了自己的兜底方法。)
-
@Component public class PaymentFallbackService implements PaymentHystrixService { @Override public String paymentInfo_OK(Integer id) { return "客户端 global-fallback 执行"; } @Override public String paymentInfo_TimeOut(Integer id) { return "客户端 global-fallback 执行"; } }
Hystrix 的服务熔断功能怎么用(在服务提供方配置)
- 在服务提供方的 service 层方法,添加如下注解即可对该方法做服务熔断。
-
//服务熔断 @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = { @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), //请求次数 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //时间范围 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸 }) public String paymentCircuitBreaker(@PathVariable("id") Integer id){ if (id < 0){ throw new RuntimeException("*****id 不能负数"); } String serialNumber = IdUtil.simpleUUID(); return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber; } public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){ return "id 不能负数,请稍候再试,(┬_┬)/~~ id: " +id; }
当导致如上方法抛出异常的请求达到熔断点时,就会短期内所有请求都走服务降级的方法,然后再慢慢的恢复正常。
断路器开启或者关闭的条件:
- 当满足一定阀值的时候(默认10 秒内超过 20 个请求次数)
- 当失败率达到一定的时候(默认10 秒内超过 50% 请求失败)
- 到达以上阀值,断路器将会开启
- 当开启的时候,所有请求都不会进行转发
- 一段时间之后(默认是 5 秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5
Hystrix 开启仪表盘进行系统实时监控(新建一个微服务,作为 Hystrix 的仪表盘)
除了提供服务熔断、降级、限流功能以外,Hystrix 还提供 了准实时的调用监控 (Hystrix Dashboard),Hystrix 会持续地记录所有通过 Hystrix 发起的请求的执行信息,拟统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix 通过 hystrix-metrics-event-stream 项目实现了对以上指标的监控。Spring Cloud 也提供了 Hystrix Dashboard 的整合,对监控内容转化成可视化界面。
- 新建一个微服务,假设端口为 901, pom 文件如下:
-
<dependencies> <!--新增hystrix dashboard--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
- 给所有需要被监控的服务提供方导入监控依赖配置
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
- 新版本 hystrix 需要在被监控微服务的主启动类上添加新的代理类如下:(否则会出现连接不上的提示)
-
@Bean public ServletRegistrationBean getServlet(){ HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }
- 启动 hystrix 仪表盘微服务,启动路径为:http://localhost:901/hystrix,填写监控地址:http://ip地址:端口号/hystrix.stream。
- 开始调用被监控系统的服务。就会看到 hystrix 仪表盘进行变动。
Hystrix 仪表盘查看说明
- 7 色
- 实心圆
实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,就
可以在大量的实例中快速的发现故障实例和高压力实例。 - 一线
曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。 - 整图说明
- 整图说明2
本文来自博客园,作者:King-DA,转载请注明原文链接:https://www.cnblogs.com/qingmuchuanqi48/p/13833361.html