Hystrix的简介及使用案例

雪崩效应:分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务,当某个服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用该服务时,最终可能使整个服务资源耗尽,无法继续对外提供服务。
Hystrix正式为了解决这种问题才出现的。
服务熔断:服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。
服务降级:当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
使用:
1.导入依赖:
<!--hystrix-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.主启动类:加上@EnableHystrix或@EnableCircuitBreaker注解。
3.配置yml:
若和openfeign一起使用,需配置:
feign:
  hystrix:
    enabled: true
4.配置注解和编写fallbackMethod方法
fallbackMethod方法为服务降级或熔断时调用的方法,是兜底的方法。
降级:

@HystrixCommand(fallbackMethod = "TimeOutHandler",commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")

execution.isolation.strategy:该属性用来设置HystrixCommand.run()执行的隔离策略。默认为THREAD。

execution.isolation.thread.timeoutInMilliseconds:该属性用来配置HystrixCommand执行的超时时间,单位为毫秒。

execution.timeout.enabled:该属性用来配置HystrixCommand.run()的执行是否启用超时时间。默认为true。

execution.isolation.thread.interruptOnTimeout:该属性用来配置当HystrixCommand.run()执行超时的时候是否要它中断。

execution.isolation.thread.interruptOnCancel:该属性用来配置当HystrixCommand.run()执行取消时是否要它中断。

该注解意味着当超时5秒后,将调用TimeOutHandler兜底。

熔断:

@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60"),

circuitBreaker.enabled:确定当服务请求命令失败时,是否使用断路器来跟踪其健康指标和熔断请求。默认为true。

circuitBreaker.requestVolumeThreshold:用来设置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为20的时候,如果滚动时间窗(默认10秒)内仅收到19个请求,即使这19个请求都失败了,断路器也不会打开。

circuitBreaker.sleepWindowInMilliseconds:用来设置当断路器打开之后的休眠时间窗。休眠时间窗结束之后,会将断路器设置为“半开”状态,尝试熔断的请求命令,如果依然时候就将断路器继续设置为“打开”状态,如果成功,就设置为“关闭”状态。

circuitBreaker.errorThresholdPercentage:该属性用来设置断路器打开的错误百分比条件。默认值为50,表示在滚动时间窗中,在请求值超过requestVolumeThreshold阈值的前提下,如果错误请求数百分比超过50,就把断路器设置为“打开”状态,否则就设置为“关闭”状态。

circuitBreaker.forceOpen:该属性默认为false。如果该属性设置为true,断路器将强制进入“打开”状态,它会拒绝所有请求。该属性优于forceClosed属性。

circuitBreaker.forceClosed:该属性默认为false。如果该属性设置为true,断路器强制进入“关闭”状态,它会接收所有请求。如果forceOpen属性为true,该属性不生效。

意味着在10秒内,10次请求有6次失败,则打开断路器,执行fallbackMethod方法。否则,将不会打开断路器。

 

全局服务降级的使用:需要将多个服务的fallbackMethod函数设置为同一个,则需要使用@DefaultProperties注解:

@DefaultProperties(defaultFallback = "Gobal_Fallback")
public class ConsumerHystrixController {
@HystrixCommand
public String paymentTimeout(@PathVariable("id") Integer id){
int i=10/0;
String result=paymentHystrixService.paymentTimeout(id);
log.info(result);
return result;
}
//全局fallback
public String Gobal_Fallback(){
return "全局FallBack";
}
}
注:该注解将全局服务降级的方法设置为Gobal_Fallback,使用全局降级的方法只需加上@HystrixCommand。
和openfeign的使用:openfeign是基于接口进行调用的框架,和Hystrix一起使用也非常简单:
@Service
@FeignClient(value="cloud-hystrix-payment",fallback = PaymentHystrixServiceImpl.class)
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
public String paymentInfo(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentTimeout(@PathVariable("id") Integer id);
}
在@FeignClient中指定fallback = PaymentHystrixServiceImpl.class
PaymentHystrixServiceImpl实现了  PaymentHystrixService中的方法, PaymentHystrixService中的接口方法一一对应。
@CoPayment
public class PaymentHystrixServiceImpl implements PaymentHystrixService{
@Override
public String paymentInfo(Integer id) {
"PaymentHystrixServiceImpl 1";
    @Override
public String paymentTimeout(Integer id) {
return "PaymentHystrixServiceImpl 2";
}
}
最后:配置
feign:
hystrix:
enabled: true
开启Hystrix的使用。

 

上一篇:SpringCloud 2020.0.4 系列之服务降级的其他用法与熔断


下一篇:我的世界Mod整合包中的Mod下载