Hystrix
一、Hystrix是什么
分布式系统面临的问题:
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系再某些时候将不可避免地失败。
服务雪崩:
多个微服务之间调用的时候,假设A调用B和C,B和C又调用其他微服务,这就是所谓的扇出。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,这就是所谓的雪崩效应。
对于高流量的应用来说,单一的后端依赖可能会导致所有的服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用还可能导致服务之间的延迟增加,备份队列、线程和其他系统资源紧张,导致整个系统发生更多的级联故障,这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失效不能取消整个应用程序或系统。
什么是Hystrix:
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免地会调用失败,比如超时、异常等等。Hystrix能保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。
二、Hystrix能做什么
Hystrix,即“断路器”,本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方法返回一个服务预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证服务调用方的线程不会被长时间不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
能做什么:
- 服务降级
- 服务熔断
- 服务限流
- 接近实时的监控
- …
三、Hystrix服务熔断的简单使用
1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2、编写Controller,指定出现异常时调用的备选方法,即其中的@HystrixCommand(fallbackMethod = "hystrixGetOne")
@GetMapping("/dept/get/{id}")
@HystrixCommand(fallbackMethod = "hystrixGetOne")
public Dept getOne(@PathVariable Long id){
Dept dept = deptService.queryById(id);
if(dept == null){
throw new RuntimeException("不存在该用户或信息无法找到");
}
return dept;
}
public Dept hystrixGetOne(@PathVariable Long id){
return new Dept()
.setDeptno(id)
.setDname("不存在该用户或信息无法找到")
.setDb_source("no this datasource in MySQL");
}
3、主类上添加熔断服务的注解@EnableCircuitBreaker
@SpringBootApplication
@EnableCircuitBreaker //熔断服务
public class DeptProviderHytrix_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProviderHytrix_8001.class, args);
}
}
四、Hystrix服务降级的简单使用
1、在api编写一个FallbackFactory(实现 FallbackFactory 接口)
@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public boolean addDept(Dept dept) {
return false;
}
@Override
public Dept queryById(Long id) {
return new Dept()
.setDeptno(id)
.setDname("该服务已经被降级")
.setDb_source("没有数据源");
}
@Override
public List<Dept> queryAll() {
return null;
}
};
}
}
2、在api接口中,@FeignClient注解中指定 fallbackFactory
@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT", fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService {
@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean addDept(Dept dept);
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept queryById(@PathVariable("id") Long id);
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> queryAll();
}
3、服务消费者端配置相关信息,开启服务降级
feign:
hystrix:
enabled: true
五、总结
服务熔断:服务端。某个服务超时或者异常,引发服务熔断机制,类似保险丝。
服务降级:客户端。从整体的网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用。此时在客户端可以准备一个 FallbackFactory,返回一个默认的缺省值,但是整体服务水平下降了。
六、DashBoard流监控的简单使用
1、在“监控页面”模块导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
服务提供端:
<!-- 完善监控信息 -->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
2、在“监控页面”模块主类添加@EnableHystrixDashboard
注解,开启监控:
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumerDashboard {
public static void main(String[] args) {
SpringApplication.run(DeptConsumerDashboard.class,args);
}
}
3、配置“监控页面”端口号:
server:
port: 9001
4、浏览器中访问:http://localhost:9001/hystrix
详情参考:
https://www.cnblogs.com/yufeng218/p/11489175.html