Hystrix-服务熔断
官方定义:
在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。 Hystrix是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。 Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。
官方作用:
Hystrix旨在执行以下操作:
提供保护并控制延迟和失败,以及通过第三方客户端库(通常是通过网络)访问的依赖项的失败。
停止复杂的分布式系统中的级联故障。
快速失败,迅速恢复。
回退并在可能的情况下正常降级。
启用近乎实时的监视,警报和操作控制。
当一切正常时,请求流如下所示:
当许多后端系统之一变得潜在时,它可以阻止整个用户请求:
随着高流量,单个后端依赖性变得潜在,这可能导致所有服务器上的所有资源在几秒钟内变得饱和。
服务雪崩:
应用程序中可能会导致网络请求通过网络或客户端库进行访问的每个点都是潜在故障的根源。 比故障更糟的是,这些应用程序还会导致服务之间的延迟增加,从而备份队列,线程和其他系统资源,从而导致整个系统出现更多级联故障。
Hystrix通过以下方式做到这一点:
将对外部系统(或“依赖项”)的所有调用包装在通常在单独线程中执行的HystrixCommand或HystrixObservableCommand对象中(这是命令模式的示例)。
超时呼叫花费的时间超过您定义的阈值。有一个默认值,但对于大多数依赖项,您可以通过“属性”自定义设置这些超时,以使它们略高于针对每个依赖项测得的99.5%的性能。
为每个依赖项维护一个小的线程池(或信号灯);如果已满,发往该依赖项的请求将立即被拒绝,而不是排队。
测量成功,失败(客户端抛出的异常),超时和线程拒绝。
如果某个服务的错误百分比超过阈值,则使断路器跳闸,以在一段时间内手动或自动停止所有对特定服务的请求。
当请求失败,被拒绝,超时或短路时执行回退逻辑。
几乎实时监控指标和配置更改。
当您使用Hystrix封装每个基础依赖项时,如上图所示的体系结构将更改为类似于下图。 每个依赖项都是相互隔离的,受到延迟时发生饱和的资源的限制,并由后备逻辑覆盖,该逻辑决定了在依赖项中发生任何类型的故障时做出什么响应:
====================================================================================================
以上是官方的介绍:https://github.com/Netflix/Hystrix/wiki
Hystrix作用:
- 服务降级:客户端, 当某个服务访问量过大,需要关闭一些其他服务,为当前高访问量的服务提供资源。
- 服务熔断:服务端, 某个服务超时或是异常,引起熔断,起到一个保险丝的作用,不至于服务崩溃
- 服务限流
- 接近实时监控
服务熔断的使用:
-
依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.7.RELEASE</version> </dependency>
-
在一个方法调用出现问题是调用备份方法,故障的方法上面使用注解:@HystrixCommend(fallbackMethod=“自定义方法名”);
-
在启动类上加注解:@EnableCircuitBreaker
服务降级的使用:
-
新建一个服务降级类继承FallbackFactory,重写create方法,方法返回需要降级的接口服务(service)
// 需要降级的服务 import com.zhang.pojo.Dept; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import java.util.List; @Component // value为注册中心服务节点名称 @FeignClient(value = "springcloud-provider-dept-8001") public interface FeignService { // 对表进行基础操作 Dept getByDno(Integer dno); int delectByDno(Integer dno); List<Dept> selectDept(); boolean insertDept(Dept dept); }
// 进行服务降级操作 package com.zhang.service; import com.zhang.pojo.Dept; import feign.hystrix.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; @Component public class FallBack implements FallbackFactory { @Override public Object create(Throwable throwable) { return new FeignService() { @Override public Dept getByDno(Integer dno) { return new Dept(); // 可以自定义返回信息,通知客户 } @Override public int delectByDno(Integer dno) { return 0; } @Override public List<Dept> selectDept() { return null; } @Override public boolean insertDept(Dept dept) { return false; } }; } }
-
在需要降级的服务的model中的配置文件开启服务降级:
feign: hystrix: enabled: true