熔断器 Hystrix
什么是Hystrix
在分布式系统中,服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务
出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞。 Hystrix Netflix 公司开
源的一个项目,它提供了熔断器功能,能够阻止分布式系统中出现联动故障 Hystrix 是通过
隔离服务的访问点阻止联动故障的,并提供了故障的解决方案,从而提高了整个分布式系统
的弹性。
为什么要有Hystrix
在微服务系统中,一个用户请求可能需要调用几个服务才能完成。当某一个服务,出现网络延迟或者故障时,
整个用户请求会处于阻塞状态,其他服务需要等待。在高并发的情况下,单个服务的延迟会导致整个请求都处于延迟状态,可能在几秒钟就使
整个服务处于线程负载饱和的状态。某个服务的单个点的请求故障会导致用户的请求处于阻塞状态,最终的结果就是整个服务
的线程资源消耗殆尽。导致整个微服务系统都不可用,即雪崩效应。为了防止雪崩效应,因而产生了熔断器模型。 Hystrix 是在业界表现非常好的一个熔断器
模型实现的开源组件,它是 Spring Cloud 组件不可缺少的一部分。
Hystrix的设计原则
- 防止单个服务的故障耗尽整个服务的 Servlet 容器(例如 Tomcat )的线程资源。
- 快速失败机制,如果某个服务出现了故障,则调用该服务的请求快速失败,而不是线程等待。
- 提供回退( fallback )方案,在请求发生故障时,提供设定好的回退方案。
- 使用熔断机制,防止故障扩散到其他服务。
- 提供熔断器的监控组件 Hystrix Dashboard ,可以实时监控熔断器的状态。
RestTemplate 和 Ribbon上使用熔断器
Hystrix配置
在上个项目基础上,修改eureka-ribbon-client配置文件:引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
在启动类上添加@EnableHystrix注解开启Hystrix熔断功能。
修改RibbonService:
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* description: RibbonService
* @author zwq
* @date 2021/10/20 22:07
*/
@Service
public class RibbonService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "hiError")
public String hi(String name) {
return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
}
public String hiError(String name){
return "hi,"+name+",error";
}
}
加上@HystrixCommand 注解,hi方法就能启动Hystrix熔断器功能。
其中,fallbackMethod 为处理回退( fallback )逻辑的方法。
启动服务,测试
依次启动eureka-server、eureka-client、eureka-ribbon-client。
访问http://localhost:8764/hi
关闭eureka-client,可以看到:
由此可见,当eureka-client不可用时,开启了熔断器,最后进入fallbackMethod。
这样的好处就是通过快速失败,请求能够得到及时处理,线程不在阻塞。
Hystrix Dashboard监控熔断状态
Hystrix Dashboard 是监控 Hystrix 的熔断器状况的一个组件,提供了数据监控和友好的图形化展示界面
新增依赖
<!--hy图形界面-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<!--hy图形界面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在启动类加上@EnableHystrixDashboard注解
依次启动eureka-server,eureka-client,eureka-ribbon-client服务。
访问:http://localhost:8764/hi
访问:http://localhost:8764/hystrix.stream ,查看熔断器数据指标。
访问:http://localhost:8764/hystrix ,然后在界面上填写http://localhost:8764/hystrix.stream 、2000、zwq(这个随意填)
点击monitor,进入页面:
该页面显示了熔断器的各种数据指标