四、Hystrix组件(*)
- 官网:https://github.com/Netflix/Hystrix
- 在分布式环境中,许多服务依赖项不可避免的会失败。Hystrix是一个库,它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止它们之间的级联故障及提供后备选项来实现这一点,所有这些都可以提高系统的整体弹性。
1.服务雪崩
- 在微服务之间进行服务调用,由于某一个服务故障,导致级联的服务故障的现象,成为雪崩效应。
- 雪崩效应描述的是服务提供方不可用,导致消费方不可用,并将不可用逐渐扩大的过程。
微服务之间链路调用图示
在某一时刻流量突然波动很大,导致某一服务(如SeverC)扛不住请求的压力,变得不可用。那么ServerB的请求也会阻塞,慢慢耗尽serverB的线程资源,导致ServerB也变得不可用,同样也会导致ServerA不可用
2.服务熔断
"熔断器"本身是一种开关装置,当某个服务发生故障后,通过断路器(hystrix)的故障监控,某个异常条件被触发,直接熔断整个服务。向请求方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出异常,就保证了服务请求方的线程不会长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。如果目标服务情况好转则恢复调用。服务熔断是解决服务雪崩的重要手段。
服务熔断图示:
3.服务降级
- 服务压力剧增时,为了保证核心服务正常运行,可以有策略的关闭微服务系统中的某些边缘服务
服务降级图示
4.服务熔断和服务降级总结
- 服务熔断必会触发服务降级,所以熔断也是降级的一种。区别在于熔断是对服务之间调用链的保护,而降级是对整个系统压力过载的一种保护。
- 都是从系统的可用性可靠性着想,为防止系统的整体缓慢甚至服务雪崩,所采取的保护手段。
5.服务熔断的实现
- 1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 2.在启动类上添加注解 @EnableCircuitBreaker。开启服务熔断
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class HystrixApplication {
}
- 3.服务熔断测试
在方法上添加注解@HystrixCommand(fallbackMethod = "demoFallback"),fallback指定服务熔断后的处理
@RestController
public class DemoController {
@GetMapping("/demo")
@HystrixCommand(fallbackMethod = "demoFallback")
public String demo(@RequestParam Integer id){
if (id <= 0) {
throw new RuntimeException("ID无效");
}
return "demo ok";
}
/**
* demo方法服务熔断后的处理
*/
public String demoFallback(Integer id) {
return "系统繁忙,请稍后再试!";
}
}
错误请求,操作多次后,熔断器打开
在熔断器打开状态下,接下来(默认)5秒内,所有请求到该接口依然会熔断处理
熔断器打开状态下,5秒后,此时熔断器处于半开状态,允许放行一个请求进来,如果该请求执行成功,则断路器会关闭,反之重新打开断路器
- Hystrix熔断器打开条件
- 1.当次数达到一定的阈值时(默认10秒内超过20个请求次数)
- 2.当失败率达到一定的比例(默认10秒内超过50%的请求失败)
- Hystrix熔断器触发熔断机制流程图
当Hystrix监控对该服务接口调用达到触发熔断器开启的条件时,会在系统中自动触发熔断器,此时任何到该接口的服务请求均不可用,默认5秒后,熔断器会处于半开状态,只允许放行一个请求到该服务接口,如果该请求执行成功,则断路器关闭,反之断路器重新打开
6.OpenFeign 集成 Hystrix
- 1.添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- consul 注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- hystrix 熔断 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
- 2.配置文件
server.port=8855
# 服务名
spring.application.name=OPENFEIGN-HYSTRIX
# consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
# 开启openfeign服务熔断处理(默认为false,不开启)
feign.hystrix.enabled=true
- 3.在启动类上添加注解
@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册客户端
@EnableCircuitBreaker // 开启断路器
@EnableFeignClients // 开启feign
public class OpenfeignHystrixApplication {
}
- 4.OpenFegin 集成 Hystrix 测试
@RestController
@Slf4j
public class TestController {
@Autowired
private HystrixClient hystrixClient;
@GetMapping("/test")
public String test(@RequestParam Integer id) {
String result = hystrixClient.demo(id);
log.info("result:{}", result);
return "test ok";
}
}
---------------
- feign客户端接口
// fallback:当接口处理异常或不可用时,进行服务熔断处理
@FeignClient(value = "HYSTRIX", fallback = HystrixClientFallback.class)
public interface HystrixClient {
@GetMapping("/demo")
String demo(@RequestParam(value = "id") Integer id);
}
- Openfeign接口服务熔断备选处理类,需实现HystrixClient接口
@Component
public class HystrixClientFallback implements HystrixClient {
@Override
public String demo(Integer id) {
return "当前请求处理失败,进行服务熔断备选处理。id:" + id;
}
}
7.Hystrix Dashboard(仪表盘)
- Hystrix Dashboard收集了每个HystrixCommand的一组度量,以高效的方式显示每个断路器的运行状况
- 作用:监控每一个@HystrixCommand注解的一组度量,构建一组信息,通过图形化方式展示当前方法@HystrixCommad的状态信息
- 1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
- 2.配置文件
server.port=9909
# 应用名
spring.application.name=HYSTRIX-DASHBOARD
# consul注册中心地址
# spring.cloud.consul.host=localhost
# spring.cloud.consul.port=8500
- 3.在启动上添加注解@EnableHystrixDashboard
@SpringBootApplication
//@EnableDiscoveryClient
@EnableHystrixDashboard // 开启熔断器仪表盘
public class HystrixDashboardApplication {
}
- Hystrix Dashboard图形化界面访问地址
http://localhost:9909/hystrix
添加需要监控的服务地址,点击【 Monitor Stream】
- Hystrix目前状态
- Hystrix 和 Hystrix Dashboard已经进入维护模式
- Hystrix Dashboard已经被废弃,替换产品:Netflix-Skunkworks/hystrix-dashboard
- 推荐使用阿里的 sentinel (流量卫兵)