SpringCloud基础Hystrix:熔断降级
Posted 烟锁迷城
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud基础Hystrix:熔断降级相关的知识,希望对你有一定的参考价值。
目录
1、基础概念
Hystrix是一个分布式组件,其主要功能有:
- 对第三方客户端访问的依赖项的延迟和故障进行保护和控制
- 在复杂的分布式系统中阻止级联故障
- 快速失败,快速恢复
- 回退,尽可能优雅地降级
- 启用近实时监控,警报和操作控制
Hystrix的设计原则如下:
- 防止任何单个依赖耗尽容器所有用户线程
- 减少负载并快速失败,取代请求排队方式
- 根据情况提供降级方法,来保护用户不受到故障影响
- 使用服务隔离的方式,限制依赖项故障产生的影响
- 以接近实时的度量,监视和警报来优化发现时间。
2、使用方式
在pom文件中增加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在application类中增加注解@EnableHystrix,启动熔断:
@EnableHystrix
@EnableFeignClients("com.my.example")
@SpringBootApplication
public class ProviderConsumerApplication
public static void main(String[] args)
SpringApplication.run(ProviderConsumerApplication.class, args);
熔断注解有两种,@HystrixCommand用于方法级别,@DefaultProperties用于类级别,他们都可以设置一个fallback方法,在方法执行出现异常时,会自动返回fallback设置方法的返回内容。
@RestController
@DefaultProperties(defaultFallback = "fallback")
public class HystrixController
@Autowired
private UserClient userClient;
@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/hystrix")
public String user()
User user = userClient.queryUser();
return "hello " + user.getName();
public String fallback()
return "服务异常";
在这个方法里,添加了熔断降级的时间,将超过3s还没有返回值的方法进行降级处理。
@HystrixCommand(fallbackMethod = "fallback", commandProperties =
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS, value = "3000")
)
@GetMapping("/hystrix")
public String user()
User user = userClient.queryUser();
return "hello " + user.getName();
3、OpenFeign使用Hystrix实现降级
在openfeign组件中,已经集成了Hystrix,可以直接进行使用。
3.1、接口写法
在@FeignClient接口中就可以设置fallback触发的类。这个熔断类需要交给IOC托管,通过实现IDataService来实现方法。
@FeignClient(value = "spring-cloud-data-provide", fallback = DataFeign.DataServiceDefaultFallback.class)
public interface DataFeign extends IDataService
@Component
class DataServiceDefaultFallback implements IDataService
@Override
public Data sayHello()
return new Data();
3.2、实现FallbackFactory
通过对FallbackFactory的实现,完成熔断。FallbackFactory中定义泛型为FeignClient本身,返回FeignClient实现类,因此要实现所有接口的抽象方法,完成熔断构建。
@FeignClient(value = "spring-cloud-user-provide", fallbackFactory = UserClient.UserClientFallback.class)
public interface UserClient
@GetMapping("/user") User queryUser();
@Component
class UserClientFallback implements FallbackFactory<UserClient>
@Override
public UserClient create(Throwable cause)
return new UserClient()
@Override
public User queryUser()
return new User();
;
4、熔断机制
Hystrix的熔断机制是,在一定时间内,超过一定百分比的请求失败了,接下来的一定时间内所有的请求都将直接fallback,不再请求至服务器。
Hystrix有三种熔断状态,分别是close,open,half open。在平时,熔断是关闭的,也就是close状态,当满足熔断发生条件时,状态会到达open,熔断开启。当上文所说的熔断时间过去之后,服务器会尝试发送一个请求,如果这个请求得到了正常响应,就可以让open回到close。
在HystrixCommandProperties类中,有参数对触发熔断的条件进行定义,并且有默认值。
- requestVolumeThreshold:最小请求次数,默认值20
- sleepWindowInMilliseconds:触发熔断后拒绝访问时长,默认值5000,即5秒
- errorThresholdPercentage:失败请求比例,默认值50
想要自定义的话,就将这几个参数加入到注解内即可
@HystrixCommand(fallbackMethod = "fallback", commandProperties =
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS, value = "3000"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "6"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "10000"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "50")
)
5、依赖隔离
除了熔断机制之外,为了避免请求无法响应导致的雪崩,Hystrix还实现了依赖隔离。在在HystrixCommandProperties类中,参数execution.isolation.strategy隔离策略起到了控制隔离方式的作用,其默认数值为线程
default_executionIsolationStrategy = HystrixCommandProperties.ExecutionIsolationStrategy.THREAD;
这个枚举中有两个类型,线程和信号量
public static enum ExecutionIsolationStrategy
THREAD,
SEMAPHORE;
private ExecutionIsolationStrategy()
5.1、线程池隔离
线程池隔离就是不同的业务运行在不同的线程池中,一旦一个请求耗尽线程资源,也只会导致一个线程池无法继续工作,不会影响到整个系统,同时线程池也具有快速恢复的能力。
缺点是线程池本身就会消耗CPU资源,需要合理规划
5.2、信号量隔离
信号量隔离会设置一个并发处理的最高上限,一旦超过这个上限,超过上限的请求就会直接返回fallback
6、Gateway使用Hystrix实现降级
在gateway组件中增加配置,增加过滤器Hystrix
其配置fallbackUri的内容是固定写法,forward后面的自定义熔断方法需要添加一个同名controller来实现熔断功能
- id: hystrix_route
uri: http://localhost:8083
predicates:
- Path=/hystrix/**
filters:
- StripPrefix=1
- name: Hystrix
args:
name: default
fallbackUri: forward:/fallback
FallbackController类写法如下,其访问路径是要与配置相同的,即fallback。
@RestController
public class FallbackController
@GetMapping("fallback")
public String fallback()
return "网关熔断";
在正式环境下,配置基本都会被配置到默认过滤器中,给每一个路由进行过滤
default-filters:
- name: Hystrix
args:
name: default
fallbackUri: 'forward:/fallback'
以上是关于SpringCloud基础Hystrix:熔断降级的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud(Hoxton.SR3)基础篇:第四章Hystrix请求熔断与服务降级
重学SpringCloud系列七之服务熔断降级hystrix
SpringCloud --- 服务降级 ( Hystrix熔断器 )