Hystrix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制。
Hystrix也是Netflix公司的一款组件。保险丝,空气开关
主页:https://github.com/Netflix/Hystrix/
Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
Hystrix会出现我们的雪崩问题,解决雪崩问题的主要方法有两个:
1.线程隔离
2.服务熔断
什么是线程隔离,服务降级
我理解的意思就是: Hystrix为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。
用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理
用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回友好的提示信息) 。
服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。
触发Hystix服务降级的情况:有我们的线程池已满和请求超时。
我们写个实例来了解一下:
首先在itcast-service-consumer的pom.xml中引入Hystrix依赖:
这是在主类写的注解,来开启我的熔断器
因为三个注解比较麻烦,我们就用一个注解来代替
我们改造itcast-service-consumer,当目标服务的调用出现故障,我们希望快速失败,给用户一个友好提示。因此需要提前编写好失败时的降级处理逻辑,要使用HystixCommond来完成:
我们刚才把fallback写在了某个业务方法上,如果这样的方法很多,那岂不是要写很多。所以我们可以把Fallback配置加在类上,实现默认fallback:
服务熔断
为了能够精确控制请求的成功或失败,我们在consumer的调用业务中加入一段逻辑:
这样如果参数是id为1,一定失败,其它情况都成功。不过,默认的熔断触发要求较高,休眠时间窗较短,为了测试方便,我们可以通过配置修改熔断策略: