「 从0到1学习微服务SpringCloud 」13 断路器Hystrix
背景与功能
在微服务架构中,很多情况下,各个服务之间是相互依赖,一个服务可能会调用了好几个其他服务,假设其中有一个服务故障,便会产生级联故障,最终导致整个系统崩溃无法使用(这称为雪崩效应),Spring Cloud Hystrix正是用来防止雪崩效应的。
功能:服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。
服务降级
定义
优先核心服务,非核心服务不可用或弱可用 比如:商城的微服架构中,突然涌入大量流量,但服务器资源是有限的,商品、订单、支付为核心服务,必须保证这些服务可用;积分、广告为非核心服务,可将其降级为弱可用或不可用。
实现
实现逻辑 1.通过HystrixCommand注解指定
2.fallbackMethod(回退函数)中实现具体降级逻辑
**代码实现(使用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()失败,会发生服务降级,调用回调函数
6.测试
浏览器输入http://localhost:8080/hys/hi
细节
若方法中出现异常时或在超时时间(默认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
在监控的界面有两个重要的图形信息:一个实心圆和一条曲线。
实心圆:1、通过颜色的变化代表了实例的健康程度,健康程度从绿色、黄色、橙色、红色递减。2、通过大小表示请求流量发生变化,流量越大该实心圆就越大。所以可以在大量的实例中快速发现故障实例和高压实例。
曲线:用来记录2分钟内流浪的相对变化,可以通过它来观察流量的上升和下降趋势。
就讲到这里咯,已同步更新github,下期见~
https://github.com/zhangwenkang0/springcloud-learning-from-0-to-1
如果觉得不错,分享给你的朋友!
一个立志成大腿而每天努力奋斗的年轻人
伴学习伴成长,成长之路你并不孤单!
「 从0到1学习微服务SpringCloud 」13 断路器Hystrix的更多相关文章
- 「 从0到1学习微服务SpringCloud 」10 服务网关Zuul
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...
- 「 从0到1学习微服务SpringCloud 」09 补充篇-maven父子模块项目
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...
- 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」05服务消费者Fegin
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 Eureka的高可用需要 ...
- 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! Spring Cloud Eureka 基于Netflix Eureka做了二次封装(Spring Clo ...
随机推荐
- windows编译caffe2遇到的问题
首先介绍下window编译caffe2整体流程: 说明:如果不需要python支持只需3.4即可,而且编译亦不会出现问题. 1. 安装python2.7,. 我使用的是anaconda python2 ...
- ZR7.26
7.26 A 并查集维护,时间复杂度我写的貌似不大对,先鸽一鸽 B 敦爷:\(w\)是这个区间的最大值当且仅当他是这个区间内最大的 我们发现结合昨天课件内的并查集 发现我们每次不断合并的本质是把所有\ ...
- ASP.NET Core 连接 GitLab 与 MatterMost 打造 devops 工具
在现代化开发工具链里面就包含了自动化的通讯工具,而日志写代码我是推到 Gitlab 平台上,我今天听了郭锐大佬的分享之后,感觉我现在的团队的自动化做的远远不够.我在他的课程上学到的最重要一句话就是做工 ...
- mysql高可用解决方案
浅谈mysql主从复制的高可用解决方案 1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称 ...
- C# 获取控制台程序路径
- SQL Server内连接、左外连接、右外连接、完全连接、交叉lianjie
数据准备: create table T1( A ) not null, B ) not null, C tinyint not null ); create table T2( B ) not nu ...
- python常见关键字的使用
常见关键字 在循环中常见的关键字使用方法 continue:结束本次循环,继续执行下一次循环 break:跳出一个循环或者结束一个循环 例 使用用户名密码登录(有三次机会)count=0while c ...
- JMM中的Happens-Before原则
在java内存模型中,happens-before应该理解为:前一个操作的结果,可以被后续的操作获取,即内存可见性. 为了解决多线程的内存可见性问题,就提出了happens-before原则, ...
- 毕业两年半,入手人生第一款macbook pro
当程序员入手第一款macbook 大家好,我是灰大狼,你们可以叫我灰狼.大狼.甚至是小灰灰. 接下来我主要跟大家分享下作为程序员的我,刚入手一款mac的使用心得. 背景 做程序员三年了,一直用的都是w ...
- 开发工具篇:JAVA和IntelliJ IDEA相恋
开发工具篇:JAVA和IntelliJ IDEA相恋 idea是什么? IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之 ...