专辑目录:SpringCloud学习日志

什么是雪崩效应?

当请求数量远超出服务器承受能力或者服务器无法再处理请求时,导致请求等待时间比较久,也就是平常说的卡。由于微服务是利用RPC相互请求的,所以可能一个接口无法访问或延迟响应,导致大量接口无法访问或延迟响应。

在项目上线之前,应该做压力测试来评估服务器承受能力。

插入一个知识点,设置Ribbon的请求响应等待时间。(如图设置超时响应时间为5秒)

###   springcluoud 默认开启ribbon了
ribbon:###  响应超时时间,单位:毫秒ReadTimeout: 5000###  连接超时时间,单位:毫秒ConnectTimeout: 5000

利用Hystrix解决雪崩效应的三大机制:服务降级、服务熔断、服务隔离

服务降级是最常用的方法,就是处理不了就不处理了,返回一个友好的提示给用户,省得用户一直等在无响应的页面。

服务熔断和服务降级是一起的,像线程池一样,超过了最大值就拒绝,然后用服务降级来提示。

服务隔离是为了防止大面积服务瘫痪,就是一个服务堵死了,其他服务也访问不了,所以将各个服务隔离开来,防止连续翻车。默认是线程池隔离的方式,即将不同的服务放在不同的线程池里,使其互不占用互不影响,但是缺点是CPU占用率大大提升,所以只对核心服务采用这种方法。

现在我们将hystrix引入项目,加入依赖

<!-- Hystrix断路器 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后在SpringBoot启动类加入注解:

@EnableHystrix

然后在application.yaml中配置hystrix的参数:

###  Hystrix
feign:hystrix:#启用Hystrixenabled: truehystrix:command:default:execution:timeout:### 关闭超时时间,如果不关闭,熔断之后就无法再访问了enabled: falsethreadpool:default:### 线程池隔离时每个线程池最大线程数,默认是10
###   coreSize: 12

为了方便测试,我就不用RPC了,只用一个项目中进行演示。

@RestController
public class TestServiceImpl implements TestService {@Override@RequestMapping("/hystrix")// fallbackMethod 指定降级后的方法@HystrixCommand(fallbackMethod = "fallback")public String hystrix() {// 使用线程睡眠来模拟请求响应缓慢try{Thread.sleep(1500);}catch (Exception e){}// 在控制台和返回信息中提示当前所调用线程String res = "hystrix处理线程池:"+Thread.currentThread().getName();System.out.println(res);return res;}// 服务降级后的方法,应该是一个简单,无业务逻辑的方法public String fallback(){String res = "服务器繁忙,请稍后再试!";System.out.println(res);return res;}@Override@RequestMapping("/just")public String just() {// 在控制台和返回信息中提示当前所调用线程String res = "just处理线程池:"+Thread.currentThread().getName();System.out.println(res);return res;}}

接口我就不贴出来了,只贴出接口实现类。

重点在于注解@HystrixCommand ,使用这个注解,会同时开启 服务隔离、服务熔断、服务降级,fallbackMethod中指定降级后执行的方法,降级后的方法应该无业务逻辑,并且友好的提示用户。

同时我也写了一个不用Hystrix 的方法just 进行比较。

在使用JMeter测试之前,我先从浏览器来请求,控制台的打印就不看了。

从浏览器的显示来看,两个请求都正常执行了,并且hystrix接口和just接口的线程池是同一个,所以服务隔离是成功的。

下面我就用JMeter来进行测试。业务hystrix的服务隔离默认方式是线程池隔离,最大线程数是10,所以我设置了20个线程同时执行,每个执行2次,共40次服务访问。由于hystrix() 方法中有1.5秒的睡眠,所以会导致只有前10个请求能正常执行,然后触发熔断和降级。

然后我来执行一下,执行之前先清空控制台打印的日志。

执行结果和预期一致,部分请求响应正常,之后的都是提示服务器繁忙(成功降级)。

我们再看控制台

控制台的结果我说明一下,先显示服务器繁忙是因为正常处理的还在线程休眠,所以降级的信息先打印出来。正常响应的打印完之后还有降级信息打印,是因为JMeter里我设置了每个线程执行2次,正常响应的在执行第二次了。为了验证我加上了时间输出。

最后结果如下,由于截图太长,我就贴日志了。显然和我想的一样。

服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
请求时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:39 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-6 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-4 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-10 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-9 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-8 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-5 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-1 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-2 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-3 响应时间:Mon Mar 23 17:35:41 CST 2020
hystrix处理线程池:hystrix-OrderServiceImpl-7 响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020
服务器繁忙,请稍后再试!响应时间:Mon Mar 23 17:35:41 CST 2020

那么在熔断降级发生之后的第二轮请求仍能有正常访问的,说明熔断之后是有服务恢复的。这是因为我前面设置了关闭超时时间,如果不设置这个,熔断之后便无法正常响应,全部都是走降级了(生产情况可能不会关闭超时时间)。

如果全部降级方法都与被降级方法在同一个类的话,比较容易搞混,所以通常采用统一fallback类来处理。

这里我就不用JMeter做雪崩了,直接把超时时间设短

然后在order下新建一个包fallback和一个类MemberServiceFallback

可以看到,这个fallback类实现了MemberServiceFegin接口,因为MemberServiceFegin接口是继承MemberService接口的,所以也要实现其接口方法。我们只关心getUserInfo方法,因为要用它做测试。然后我们在Order的Controller接口OrderService和其impl中加上hystrix2方法。

hystrix2方法中一样是简单的调用一下MemberSerivce的getUserInfo()方法。

因为我们的getUserInfo方法有1.5秒的等待时间,而ribbon只等1秒,所以会走服务降级。

最后我们在MemberServiceFegin里指定降级方法的类为MemberServiceFallback。然后依次启动项目。

可见是走了服务降级方法。如果我们把ribbon的等待时间延长至2秒再一样的重启order并访问。

可以看到并没有走服务降级,达到预期结果。

SpringCloud学习笔记(十二)基于Hystrix解决雪崩效应相关推荐

  1. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  2. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  3. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  4. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

  5. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

  6. 【现代机器人学】学习笔记十二:轮式移动机器人

    目录 轮式机器人类型 全向轮式机器人 建模 单个全向轮是怎么运动的 多个全向轮是如何带动底盘运动的 运动规划和反馈控制 非完整约束轮式移动机器人 建模 独轮车 差速驱动机器人 车型机器人 非完整移动机 ...

  7. 【theano-windows】学习笔记十二——卷积神经网络

    前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上? 卷积小知识 ...

  8. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 变量的地址就是指针,存放指针的变量就是指针变量(因而又叫作地址变量 address variable); 这个地址编号本身就是一个无符号的整数,在32位系统下为4字节(8位 ...

  9. Vue.js 学习笔记 十二 Vue发起Ajax请求

    首先需要导入vue-resource.js,可以自己下载引入,也可以通过Nuget下载,它依赖于Vue.js. 全局使用方式: Vue.http.get(url,[options]).then(suc ...

最新文章

  1. java raw_GitHub - Braw115/JavaWEB: JavaWEB学习之中的一些Demo
  2. Mysql多实例配置文档
  3. java it_Java中的Iterator的用法
  4. 游戏运营期间我的项目开发经验总结——纪律性和卡顿处理
  5. 牛客网 对称平方数【回文数的判断 两个vector是否相等】
  6. POJ 2176 Folding(区间DP)
  7. Linux的setup命令启动服务名称和功能
  8. 奥巴马写的c语言正方形,团体程序设计天梯赛-练习集 L1-015 跟奥巴马一起画方块...
  9. idea中maven下载依赖包出错
  10. 欠定线性系统与正则化
  11. cmos和ttl_TTL与CMOS详细介绍
  12. 命令行启动mysql闪退
  13. 入门级测试Kotlin实现PopWindow弹窗代码
  14. 在 Windows Service 服务上部署 AutoVue_EMP_21_0_2 的操作手册
  15. Jeecg-Boot前端部署
  16. 网易杭研 java 校招_09网易杭研校园招聘面试题
  17. 色温(Kelvin)到RGB的转换:算法和样例
  18. 好教程推荐系列:《C++新经典》和《Visual C++ 2017从入门到精通》
  19. Doo Prime 提供高达 1000 倍杠杆,助您撬动无限机遇
  20. 【0基础】最简单的英灵神殿/Valheim服务器搭建实战教学

热门文章

  1. 如何带团队,怎么带团队。
  2. VoLTE、VoWiFi和VoIP有什么不同?
  3. 模板配置--后台管理系统
  4. 使用OneNote来构建你自己的知识库
  5. 华为CE系列和S系列交换机堆叠配置及mad检测
  6. CryptoJS v3.1.2 源码自取
  7. DOTA2匹配机制详解
  8. 改善内部客户服务的 3 个技巧
  9. 静态页面 常见问题 margin-top塌陷、padding把盒子撑大
  10. git与github使用