在微服务架构中,不少状况下,各个服务之间是相互依赖,一个服务可能会调用了好几个其余服务,假设其中有一个服务故障,便会产生级联故障,最终致使整个系统崩溃没法使用(这称为雪崩效应),Spring Cloud Hystrix正是用来防止雪崩效应的。git
功能:服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。github
优先核心服务,非核心服务不可用或弱可用 好比:商城的微服架构中,忽然涌入大量流量,但服务器资源是有限的,商品、订单、支付为核心服务,必须保证这些服务可用;积分、广告为非核心服务,可将其降级为弱可用或不可用。web
实现逻辑 1.经过HystrixCommand注解指定
2.fallbackMethod(回退函数)中实现具体降级逻辑spring
**代码实现(使用eureka-client项目) ** 1.将config相关配置注释掉(不想多开个服务呀)浏览器
2.添加maven缓存
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
3.启动类加上@EnableCircuitBreaker注解服务器
4.新建一个controller作测试架构
//添加Hystrix的注解,并指定回调函数 @HystrixCommand(fallbackMethod = "fallback") @RequestMapping("/hys/hi") public String sayHi(){ return hiService.hi(); } /** * 上面方法指定的回调函数 * 当上面的方法出现异常或在指定时间未返回时(默认超时时间1s),会调用此函数 * @return */ public String fallback(){ return "用户拥挤,请稍后再试!"; }
5.启动eureka-server,eureka-client项目,故意不开启service-hi项目,上面例子中调用hiService.hi()失败,会发生服务降级,调用回调函数app
6.测试
浏览器输入http://localhost:8080/hys/himaven
若方法中出现异常时或在超时时间(默认1s)内未返回时,会调用回调函数,实现降级处理。
**须要注意:**这里有个超时时间,Hystrix默认1s,这个须要根据实际业务设置,能够经过一下注解进行设置
@HystrixCommand(commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="3000") },fallbackMethod = "fallback")
Hystrix会自动实现依赖隔离,这里所指的依赖隔离是线程池隔离。
Hystrix会为每个@HystrixCommand注解的方法建立一个线程池,这样的话,当某个方法有线程延迟时,也不会影响到其余的方法。
服务熔断的原理就好像咱们家里的电闸同样,当电流过大,为了保护电器,会出现跳闸的现象。
服务熔断也是同样,当遇到不断地出现异常的情况时,达到某个阈值时会触发熔断,而降级调用回调函数。
@HystrixCommand(commandProperties = { //开启熔断 @HystrixProperty(name = "circuitBreaker.enabled",value="true"), //一个rolling window内最小的请求数。 默认20 // 若是设为20,那么当一个rolling window(统计时间段,默认10s)的时间内收到19个请求,即便19个请求都失败,也不会触发circuit break(熔断)。 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value="10"), //触发短路的时间值,当该值设为5000时,则当触发circuit break后的5000毫秒内都会拒绝request,也就是5000毫秒后才会关闭circuit(断路器)。默认5000 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value="10000"), //错误比率阀值,若是错误率>=该值,circuit(断路器)会被打开,并短路全部请求触发fallback。默认50 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value="60") },fallbackMethod = "fallback") @GetMapping("/hys/circuitSayHi") public String circuitSayHi(Integer number){ if(number == 2){ return "success"; } return hiService.hi(); } public String fallback(Integer number){ return "用户拥挤,请稍后再试!"; }
测试
背景:当我传递参数number=2的时,服务调用是成功的,不然失败(因service-hi不开启)
1.直接调用
http://localhost:8080/hys/circuitSayHi?number=2 访问成功(用于对比参照)
2.在10秒内(rolling window),调用http://localhost:8080/hys/circuitSayHi10次(咱们设置错误率为60%) 由于开始调用时不必定就在一个rolling window开头,因此咱们调用10次,确定会触发熔断
3.而后调用
http://localhost:8080/hys/circuitSayHi?number=2,处在断路状态,仍然调用的是回调函数
hystrix: command: default: circuitBreaker: #开启熔断 enabled: true #滚动窗口中将使断路器跳闸的最小请求数量 requestVolumeThreshold: 20 #设置失败百分比的阈值。若是失败比率超过这个值,则断路器跳闸而且进入fallback逻辑 errorThresholdPercentage : 60 execution: isolation: thread: #设置调用者执行的超时时间(单位毫秒) timeoutInMilliseconds: 2000 #为某个方法设定特殊的配置 方法名 circuitSayHi: circuitBreaker: #开启熔断 enabled: true #滚动窗口中将使断路器跳闸的最小请求数量 requestVolumeThreshold: 10 #设置失败百分比的阈值。若是失败比率超过这个值,则断路器跳闸而且进入fallback逻辑 errorThresholdPercentage : 40 execution: isolation: thread: #设置调用者执行的超时时间(单位毫秒) timeoutInMilliseconds: 1000
更多配置项,自定谷歌百度
Hystrix提供了一个图形化界面,用于监控断路状况
1.添加maven
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency>
2.添加配置
management: endpoints: web: exposure: # 开启指定端点 include: 'hystrix.stream'
3.重启项目,打开 http://localhost:8080/hystrix
4.分别调用一下
http://localhost:8080/hys/circuitSayHi?number=2
http://localhost:8080/hys/circuitSayHi
在监控的界面有两个重要的图形信息:一个实心圆和一条曲线。
实心圆:一、经过颜色的变化表明了实例的健康程度,健康程度从绿色、黄色、橙色、红色递减。二、经过大小表示请求流量发生变化,流量越大该实心圆就越大。因此能够在大量的实例中快速发现故障实例和高压实例。
曲线:用来记录2分钟内流浪的相对变化,能够经过它来观察流量的上升和降低趋势。
就讲到这里咯,已同步更新github,下期见~
https://github.com/zhangwenkang0/springcloud-learning-from-0-to-1
若是以为不错,分享给你的朋友!
一个立志成大腿而天天努力奋斗的年轻人
伴学习伴成长,成长之路你并不孤单!