NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## 一、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的集成工作。 ![](https://img.kancloud.cn/d8/6d/d86da73649731ca9c1e483f2be4fda07_1035x210.png) 所以本节的代码是在:《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`注解 ![](https://img.kancloud.cn/f5/e9/f5e99dfc35bd17bc147014808ddae73f_651x347.png) ## 四、服务熔断注解实现方式(方法级别) 我们仍然以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)