## 一、Hystrix简介
Hystrix是一个用于微服务系统的延迟和容错库,旨在远程系统、服务和第三方库出现故障的时候,隔离服务之间的接口调用,防止级联故障导致服务雪崩。
* Hystrix github官网:[https://github.com/Netflix/Hystrix](https://github.com/Netflix/Hystrix)
* Hystrix项目目前已经进入到维护阶段,不再开发新版本。即便如此,Hystrix的很多概念和设计思想都非常有价值,仍然值得学习
* Hystrix进入维护阶段之后,Netflix的建议是使用[resilience4j](https://github.com/resilience4j/resilience4j),但是目前国内使用者比较少。更多的还是使用了 Spring Cloud Alibaba的sentinel。(后面章节为大家介绍)
* 无论是setinel还是hystrix都借鉴了hystrix的设计,所以学习hystrix还是非常有必要的
> 笔者强烈建议:Spring Cloud微服务系统使用sentinel代替hystrix。除非你的既有项目代码改造难度比较大,新项目一定要用Sentinel。
## 二、文档代码分支介绍
我们的文档写到这里,已经形成了两大git核心分支(可以参考git仓库代码):
* master分支:以ribbon、openfeign为基础,以alibba nacos为核心,后续会在此基础上讲解Spring Cloud alibaba setinel,SpringCloud GateWay
* netflix分支:以ribbon、openfeign为基础,以Eureka 和Spring Cloud config为核心,我们本节就在此分支的基础上完成netflix的集成工作。

所以本节的代码是在:《bus实现批量配置刷新》章节的基础上完成的。要想学习好本章节,必须掌握netflix分支之前的内容。
## 三、微服务集成Hystrix
在aservice-rbac和aservice-sms微服务项目中通过maven坐标引入hystrix。在旧的版本中引入hystrix使用`spring-cloud-starter-hystrix`,但在笔者使用的Spring Cloud Hoxton.SR3版本中要使用`spring-cloud-starter-netflix-hystrix`。
~~~
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<!--artifactId>spring-cloud-starter-hystrix 新版不要用这个</artifactId-->
</dependency>
~~~
> 在Spring Cloud项目最开始的时候几乎所有组件都是netflix公司贡献的,随着netflix公司对spring cloud社区的支持减弱,更多的厂商加入spring cloud开源社区。Spring Cloud社区开始通过maven坐标区别类库,如:`spring-cloud-starter-alibaba-*`、`spring-cloud-starter-netflix-*`
* yml配置文件(本地application.yml或config git仓库中的yml配置文件)和之前的章节不需要有任何变化,但配置文件中要包含最基本的spring boot启动信息和eureka注册信息。
* 在服务入口启动类上面加上`@EnableCircuitBreaker`注解

## 四、服务熔断注解实现方式(方法级别)
我们仍然以SystemService的密码重置接口为例,讲解服务熔断配置的代码实现方法。通过在方法上加上HystrixCommand注解和HystrixProperty注解来实现某个方法的服务熔断配置。
~~~
@PostMapping(value = "/pwd/reset")
@HystrixCommand(
commandProperties = {
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000") //统计窗口时间
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //启用熔断功能
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"), //20个请求失败触发熔断
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //请求错误率超过60%触发熔断
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "300000"),//熔断后开始尝试恢复的时间
}
)
public AjaxResponse pwdreset(@RequestParam Integer userId) {
sysuserService.pwdreset(userId);
return AjaxResponse.success("重置密码成功!");
}
~~~
* 熔断开关:enabled=ture,打开断路器状态转换的功能。
* 熔断阈值配置
* requestVolumeThreshold=20,表示在Hystrix默认的时间窗口10秒钟之内有20个请求失败(没能正常返回结果),则触发熔断。断路器由“关闭状态”进入“开启状态”。
* errorThresholdPercentage=60,表示在Hystrix默认的时间窗口10秒钟之内有60%以上的请求失败(没能正常返回结果),则触发熔断。断路器由“关闭状态”进入“开启状态”。
* 熔断恢复时间:sleepWindowInMilliseconds=300000,表示断路器开启之后300秒钟进入半开启状态。(为了后面测试方便,我们把熔断恢复时间设置为5分钟)
通过上面的配置,我们就可以针对pwdreset实现服务熔断,下一节课我们将针对上面的配置信息进行测试。上面用到的配置项是我们在使用Hystrix进行服务熔断最常用的配置,如果你想了解更多的关于Hystrix的配置,请参考附录(其中一些关于服务降级的配置,我们后面章节还会讲)。
## 五、服务熔断全局配置
我们可以看到上面的使用注解针对方法进行服务熔断的配置,虽然可以实现功能,但是无疑增大了我们的代码量,而且非常冗余。为了解决这个问题,我们可以使用全局配置来实现:
~~~
hystrix:
command:
default:
circuitBreaker:
enabled: true
requestVolumeThreshold: 20
errorThresholdPercentage: 60
sleepWindowInMilliseconds: 300000
~~~
全局配置完成之后,想让哪一个方法实现断路器功能,就在哪一个方法上加上注解:
~~~
@HystrixCommand
~~~
比较好的实践方案是:针对系统内的绝大部分接口调用采用全局配置的方式,针对个别个性化重点业务接口使用注解配置。**注解配置属性会覆盖全局配置属性,注解配置的优先级更高**。
## 附录:HystrixCommand所有配置项
英文官方文档:[https://github.com/Netflix/Hystrix/wiki/Configuration](https://github.com/Netflix/Hystrix/wiki/Configuration)
- 文档简介
- 模块与代码分支说明
- dongbb-cloud项目核心架构
- 微服务架构进化论
- SpringBoot与Cloud选型兼容
- Spring Cloud组件的选型
- 单体应用拆分微服务
- 单体应用与微服务对比
- 微服务设计拆分原则
- 新建父工程及子模块框架
- 通用微服务初始化模块构建
- 持久层模块单独拆分
- 拆分rbac权限管理微服务
- Hello-microservice
- 构建eureka服务注册中心
- 向服务注册中心注册服务
- 第一个微服务调用
- 远程服务调用
- HttpClient远程服务调用
- RestTemplate远程服务调用
- RestTemplate多实例负载均衡
- Ribbon调用流程源码解析
- Ribbon负载均衡策略源码解析
- Ribbon重试机制与饥饿加载
- Ribbon自定义负载均衡策略
- Feign与OpenFeign
- Feign设计原理源码解析
- Feign请求压缩与超时等配置
- 服务注册与发现
- 白话服务注册与发现
- DiscoveryClient服务发现
- Eureka集群环境构建(linux)
- Eureka集群多网卡环境ip设置
- Eureka集群服务注册与安全认证
- Eureka自我保护与健康检查
- 主流服务注册中心对比(含nacos)
- zookeeper概念及功能简介
- zookeeper-linux集群安装
- zookeeper服务注册与发现
- consul概念及功能介绍
- consul-linux集群安装
- consul服务注册与发现
- 通用-auatator导致401问题
- 分布式配置中心-apollo
- 服务配置中心概念及使用场景
- apollo概念功能简介
- apollo架构详解
- apollo分布式部署之Portal
- apollo分布式部署之环境区分
- apollo项目权限管理实战
- apollo-java客户端基础
- apollo与SpringCloud服务集成
- apollo实例配置热更新
- apollo命名空间与集群
- apollo灰度发布(日志热更新为例)
- SpringCloudConfig配置中心
- config-git配置文件仓库
- config配置中心搭建与测试
- config客户端基础
- config配置安全认证
- config客户端配置刷新
- config配置中心高可用
- BUS消息总线
- bus消息总线简介
- docker安装rabbitMQ
- 基于rabbitMQ的消息总线
- bus实现批量配置刷新
- alibaba-nacos
- nacos介绍与单机部署
- nacos集群部署方式(linux)
- nacos服务注册与发现
- nacos服务注册中心详解
- nacos客户端配置加载
- nacos客户端配置刷新
- nacos服务配置隔离与共享
- nacos配置Beta发布
- 服务熔断降级hystrix
- 服务降级&熔断&限流
- Hystrix集成并实现服务熔断
- Jemter模拟触发服务熔断
- Hystrix服务降级fallback
- Hystrix结合Feign服务降级
- 远程服务调用异常传递的问题
- Hystrix-Feign异常拦截与处理
- Hystrix-DashBoard单服务监控
- Hystrix-dashboard集群监控
- 分布式系统流量卫兵sentinel
- sentinel简介与安装
- 客户端集成与实时监控
- 实战流控规则-QPS限流
- 实战流控规则-线程数限流
- 实战流控规则-关联限流
- 实战流控规则-链路限流
- 实战流控效果-WarmUp
- 实战流控效果-匀速排队
- BlockException处理
- 实战熔断降级-RT
- 实战熔断降级-异常数与比例
- DegradeException处理
- 注解与异常的归纳总结
- Feign降级及异常传递拦截
- 动态规则nacos集中存储
- 热点参数限流
- 系统自适应限流
- 微服务网关-GateWay
- 还有必要学习Zuul么?
- 简介与非阻塞异步IO模型
- GateWay概念与流程
- 新建一个GateWay项目
- 通用Predicate的使用
- 自定义PredicateFactory
- 编码方式构建静态路由
- Filter过滤器介绍与使用
- 自定义过滤器Filter
- 网关请求转发负载均衡
- 结合nacos实现动态路由配置
- 整合Sentinel实现资源限流
- 跨域访问配置
- 网关层面全局异常处理
- 微服务网关安全认证-JWT篇
- Gateway-JWT认证鉴权流程
- 登录认证JWT令牌颁发
- 全局过滤器实现JWT鉴权
- 微服务自身内部的权限管理
