一、Hystrix断路器
- https://github.com/Netflix/Hystrix/wiki
微服务宕机时,ribbon 无法转发请求
Hystrix断路器:系统容错工具----核心功能:降级、熔断
1、Hystrix降级
降级:调用远程服务失败(异常、超时、服务不存在),可以通过执行当前服务中的一段代码来向客户端发回响应
1.1、降级响应:根据具体情况来定
(1)错误提示
(2)返回缓存数据,有数据,redis
超时:快速失败(可设置超时时间,到时间直接降级返回),及时后台服务故障,也要让客户端尽快得到错误提示,而不能让客户端等待。
1.2、添加降级
- 1、添加 Hystrix 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
# 配置允许监控的主机地址
hystrix:
dashboard:
proxy-stream-allow-list: localhost
- 2、启动类添加 @EnableCircuitBreaker
- 3、添加降级代码
在远程调用方法上添加:
@HystrixCommand(fallbackMethod=“降级方法方法名”) – 自动跳转到另一个方法去执行
完成降级方法,返回降级响应,降级错误提示。 - 超时:等待响应,时长:默认是1000ms=1s
- ribbon的重试可继续执行,单发送不了客户端,执行成功的结果无效,原因:一次请求,一次响应。
1.3、Hystrix超时
默认1秒超时,执行降级
如果配置了ribbon重试,重试还会继续执行,最终重试结果无效
Hystrix超时 >= Ribbon 总的超时时长
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 500 # 默认是1000
2、Hystrix熔断
- 1、当请求量增大、出现过多错误,hystrix可以和后台服务断开连接(过热保护/跳闸)
- 2、可以避免雪崩效应、故障传播
- 3、限流措施:流量过大时造成服务故障,可以断开服务,降低它的流量
- 4、在特定条件下会自动触发熔断
(1)10秒内20次请求(必须首先满足),10秒时间口,参数可以更改
(2)50%出错,执行了降级代码
(3)半开状态 – 可以自动恢复,:断路器打开几秒后进入半开状态,尝试发送请求,若成功则自动关闭断路器,恢复正常;若失败则保持打开状态几秒钟,继续执行。 - 5、半开状态下可以自动恢复
断路器打开几秒后,进入半开状态,尝试发送请求,- 如果请求成功自动关闭断路器恢复正常
- 如果请求失败,再保持打开状态几秒钟
3、Hystrix配置
-
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
请求超时时间,超时后触发失败降级 -
hystrix.command.default.circuitBreaker.requestVolumeThreshold
10秒内请求数量,默认20,如果没有达到该数量,即使请求全部失败,也不会触发断路器打开 -
hystrix.command.default.circuitBreaker.errorThresholdPercentage
失败请求百分比,达到该比例则触发断路器打开 -
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds
断路器打开多长时间后,再次允许尝试访问(半开),仍失败则继续保持打开状态,如成功访问则关闭断路器,默认 5000
二、hystrix dashboard 断路器仪表盘
hystrix dashboard:Hystrix监控仪表盘,监控 Hystrix 降级和熔断的错误信息;hystrix 对请求的降级和熔断,可以产生监控信息,hystrix dashboard可以实时的进行监控
1、actuator
1.1、介绍
springboot 提供的项目监控工具,提供了多种项目的监控数据(默认)
- 健康状态
- 系统环境
- beans - spring容器中所有的对象
- mappings - spring mvc 所有映射的路径
- …
hystrix在actuator中,添加了自己的监控数据
1.2、添加actuator
(1)添加 actuator 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)yml 配置暴露监控信息
m.e.w.e.i="*" - 暴露所有监控
m.e.w.e.i=[“health”, “beans”, “mappings”]
m.e.w.e.i=beans
management:
endpoints:
web:
exposure:
include: hystrix.stream # "*"
# - beans
# - env
(3)访问:http://主机+端口号/actuator/
1.3、搭建 Hystrix Dashboard(仪表盘)
Hystrix Dashboard:完全独立的项目,不用注册和连接注册中心
(1)添加Hystrix Dashboard 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
(2)yml配置,配置端口
hystrix:
dashboard:
proxy-stream-allow-list: localhost
(3)添加 @EnableHystrixDashboard,@EnableDiscoveryClient
(4)访问:http://xxx/hystrix
在输入框中:填写要监控(监控端点)的数据路径
eg:http://localhost:3001/actuator/hystrix.stream
填入 hystrix 的监控端点,开启监控
- http://localhost:3001/actuator/hystrix.stream
- 通过 hystrix 访问服务多次,观察监控信息
cluster–集群;circuit–电路
(5)hystrix 熔断
整个链路达到一定的阈值,默认情况下,10秒内产生超过20次请求,则符合第一个条件。
满足第一个条件的情况下,如果请求的错误百分比大于阈值,则会打开断路器,默认为50%。
Hystrix的逻辑,先判断是否满足第一个条件,再判断第二个条件,如果两个条件都满足,则会开启断路器。
断路器打开 5 秒后,会处于半开状态,会尝试转发请求,如果仍然失败,保持打开状态,如果成功,则关闭断路器
1.4、压力测试工具:apach的并发访问测试工具ab
http://httpd.apache.org/docs/current/platform/windows.html#down
- 用 ab 工具,以并发50次,来发送20000个请求
ab -n 20000 -c 50 http://localhost:3001/item-service/35
- 断路器状态为 Open,所有请求会被短路,直接降级执行 fallback 方法