Hystrix是什么东西?百度一下:mysql
没错,hystrix是豪猪的意思,做为SpringCloud微服务系统中保持服务稳定的重要组件,正如它的名字同样,它对整个系统起到了保护的做用。web
在许多文章当中把hystrix描述为熔断器,便于咱们结合生活来理解。想象一下,你在家使用了不少的大功率的电器,致使电路的压力很大,当达到spring
一个临界值的时候,就会跳闸。而在一个庞大的微服务系统中,有几十上百个服务同时运行,若是由于一个服务故障致使整个系统崩溃,这是不可想象的,sql
因此有了hystrix,用于出现故障的时候提供服务降级,服务熔断,服务监控等手段来保护系统。网络
下面咱们就来简单的介绍一下hystrix如何使用。微服务
依赖引入ui
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
基本在SpringCloud中使用任何一个功能都须要引入依赖,好比服务发现,统一配置,网关,服务追踪等等。spa
基本使用3d
启动类加注解code
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
加上注解后咱们就可使用hystrix,这里我提供一个场景:
现有订单服务和商品服务两个服务,订单服务调用商品服务的商品列表接口,咱们经过这个服务之间的调用来看两种hystrix的应用:服务降级和服务熔断。
先说服务降级,服务降级是什么呢?
咱们去菜市买肉,一开始呢,我想吃牛肉,因而问老板有没有牛肉,老板说没有;而后我下降档次,选择猪肉,仍是没有;最后买了鸡肉。这就是一个
降级的过程,老板对我提供服务,当不能知足个人请求的时候,他会告诉我没有。若是没有作服务降级,那么当我问老板的时候,老板直接不鸟我,这种就是
服务态度恶劣,很垃圾的服务。
对应到微服务体系中,就是说当服务不可用或者出现故障的时候须要有应急措施来响应客户的请求。下面是具体应用,比较简单,先看未使用服务降级的场景:
当两个服务都正常运行的时候,不用说,一点儿问题都没有。而后咱们将product服务关闭掉:
直接报500了,这样对普通用户很不友好,又不是每个人都知道httpcode的含义,那怎么办呢?有人可能会想到根据httpcode定义不一样错误提示页面,这也是
一个是思路,可是根据httpcode只能作到把错误抽出来造成几个公共的提示页面,而不能每个接口都返回不一样的提示,针对这个问题,咱们就可使用到hystrix的服务
降级功能了。具体步骤是在要作服务降级的接口上加@HystrixCommand注解,并定义服务降级的方法:
1 private String fallback(int id){ 2 return "当前网络繁忙,请稍后再试哦!" + id; 3 }
在@HystrixCommand注解中指定方法:
这时候再来看order服务调用product服务:
出现了咱们想要的提示,这样对用户来讲,至少比直接返回个错误码或者啥都不返回要强的多吧。。。
接下来再看看服务熔断,服务熔断就如咱们开篇所说的,就是一个开关,能够预防雪崩问题的出现,不会出现一个服务挂掉拖死N个服务的问题。
咱们如今假设订单服务须要频繁的调用商品服务,而商品服务因为某种缘由出现了单点故障不能访问mysql,此时订单服务的请求还在不断的过来,
这些请求来到商品服务以后执行了商品这边一大堆的逻辑以后却发现不能入库,what fuck?这就很尴尬了对不对,因而乎,熔断器应运而生。
咱们能够在@HystrixCommand中定义请求商品服务是否开启熔断器、请求数量阈值,错误占比,超时时间等,具体的能够直接看源码里面有那些属性:
circuitBreaker.enabled:开启熔断器
circuitBreaker.requestVolumeThreshold:当请求达到这个数量以后,才进行错误占比的计算。
circuitBreaker.errorThresholdPercentage:错误占比,当错误次数超过这个百分比,就会熔断。
circuitBreaker.sleepWindowInMilliseconds:半打开休眠时间,熔断以后过了这段休眠时间,就会半打开,尝试接口是否恢复,若是恢复就彻底打开熔断器。
因为参数比较多,能够放到类上面或者配置文件里面全局配置:
1 @DefaultProperties(defaultFallback = "fallbackForGlobal", commandProperties = { 2 @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), 3 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), 4 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), 5 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")})
配置好了尝试调用接口,当请求10次,若是其中五次都失败了,那么该接口就会被熔断,直接返回服务降级方法锁返回的。
最后,说下服务监控,就是hystrix提供的web仪表盘(hystrix dashboard),仍是老套路,加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
加注解
把SpringBoot的endpoints开启:
启动以后访问http://localhost:8100/hystrix
根据提示输入地址和title,title就是服务名,我这里是order
就能够进入这个页面了
而后咱们来几回错误请求:
就会在仪表盘上看到错误率这些,具体使用还请各位看官自行根据实践。
好啦,本文就到此结束了,感谢阅读本文。