微服务绕不过的坎-服务雪崩

news2024/11/15 18:05:59

引言

书接上篇 微服务外交官-Feign ,讲完了SpringCloud Alibaba 远程调用组件Feign之后,接下来讲微服务项目绕不开的问题:服务雪崩。

概念

微服务架构应用设计其目的之一是为了应对高并发环境,那问题来,高并发环境会带来啥问题,微服务架构设计时需要考虑啥预防性操作?

在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题或者调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。 更糟糕的是:服务与服务之间是有依赖性,这就导致了故障传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 “雪崩效应” 。正应了那就广告词:得了灰指甲,一个传染两

模拟场景

假设一个项目拆分以下几个服务:服务A~服务I

情景1: 微服务之间相互调用,关系复杂,正常情况如下图所示:

情景2:某个时刻,服务A挂了,服务B和服务C依然在调用服务A  

情景3:由于服务A挂了,导致服务C和服务B无法得到服务A的响应,这时候服务C和服务B由于大量线程积压,最终导致服务C和服务B挂掉.  

情景4: 相同道理,由于服务之间有关联,所以会导致整个调用链上的所有服务都挂掉.  

 这下好了,全家整整齐齐~

代码模拟

上面模拟微服务雪崩场景的过程,肯定有小伙伴抬杠,这些都是你YY的,唬我啊。那接下来使用代码模拟一下。

需求:设计2个接口,一个高频访问,然后再访问另外一个接口,观察响应
 

步骤1:在订单服务中新建SentinelController.java

@RestController
public class SentinelController {
    @RequestMapping("/sentinel1")
    public String sentinel1(){
        //模拟一次网络延时
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "sentinel1";
    }
    @RequestMapping("/sentinel2")
    public String sentinel2(){
        return "测试高并发下的问题";
    }
}

步骤2:修改配置文件中tomcat的并发数

server:
  port: 8091
  tomcat:
    threads:
      max: 10 #tomcat的最大并发值修改为10,

springboot项目内嵌的tomcat理论是没有请求数限制的,在资源耗尽之前可以无休止开启线程处理请求,这里为了模拟资源极限,限制最大只能10个线程。另外保护你电脑避免蓝屏。

步骤3:接下来使用压测工具,对请求进行压力测试

下载地址Apache JMeter - Apache JMeter™

1>修改配置,并启动软件

进入bin目录,修改jmeter.properties文件中的语言支持为language=zh_CN,然后点击jmeter.bat

启动软件。

2>添加线程组

3>配置线程并发数

4>添加Http请求

 

 5>配置取样,并启动测试

 

 

上面操作意思是模拟50人不停给你项目发请求,访问/sentinel1接口 

6>访问 http://localhost:8091/sentinel2 观察结果

此时会发现, 由于/sentinel1方法进来大量的请求,项目资源有限,一时半会处理不过来,导致请求一直在囤积等待, 这就像一堆拿钱不干活的人,迟早耗死你。当sentinel2接口请求出现时,此时的资源全部被/sentinel1请求占据了,分给这边的资源基本没有,那就出现等待。如果资源耗尽,那大家一起挂了,这就是服务雪崩的雏形。

总结

服务器的雪崩效应其实就是由于某个微小的服务挂了,导致整一大片的服务都不可用。类似生活中的雪崩效应,由于落下的最后一片雪花引发了雪崩的情况。

雪崩发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个服务响应变慢,亦或是某台机器的资源耗尽等等,各式各样,千奇百怪。而我们又无法完全杜绝雪崩的发生,能做的只有提高服务容错率,保证在一个服务发生问题,不会影响到其它服务的正常运行。那该怎么提高容错率呢?请听下回分解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计医院挂号住院管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

BBR 数学模型直观展示

看 BBR 的理想图示: 但现实中数据包到达并非绝对均匀,考虑统计突发,实际情况如下: ​后文将 Delivery Rate 设为 B(Bandwidth),将 RTT 设为 D(Delay)。 B/inflt 曲线一定上凸,可想象 1 个 inflt 只有一种…

HTML+CSS+JS网页设计期末课程大作业 DW个人博客网站制作 web前端开发技术 web课程设计 网页规划与设计

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

并发编程知识总结

并发编程知识总结 最近学习了:冰河《深入理解高并发编程》;《并发编程的艺术》; 特此简要对学习做了部分总结,方便后续对并发编程知识的完善和巩固; 若想深入了解学习,可阅读上述参考原著; 线…

基于蝙蝠优化算法的电力系统经济调度研究(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

刷题5-合并两个有序数组

刷题5-合并两个有序数组 解题思路: 把数组nums2的元素复制到数组nums1中,然后利用Java的Arrays.sort()数组排序,默认从小到大 核心代码: class Solution {public void merge(int[] nums1,int m,int[] nums2,int n){for(int i0…

Learning From Documents in the Wild to Improve Document Unwarping论文学习笔记

1 广告 论文2022年发表在SIGGRAPH顶会上。 预训练出来的模型有139M。 对文档的去扭曲变形效果在我们调研的深度学习模型里面算是最好的。 2 摘要 文档图像去扭曲是文档数字化和分析的重要内容。最先进的方法依靠纯合成数据来训练深度网络进行去扭曲。因此,经过训…

为 Go 开发配置Visual Studio Code

在本快速入门中,你将安装和配置 Go for Visual Studio Code 扩展。 在 2020 年 Go 开发人员调查结果中,41% 的受访者选择Visual Studio Code作为他们最喜欢的 Go 编辑器。 这使得Visual Studio Code成为 Go 开发人员最常用的编辑器。 Visual Studio Co…

中间代码生成(Intermediate Code Generation)

中间代码生成(Intermediate Code Generation)申明语句的翻译类型表达式申明式语句翻译简单赋值语句的翻译数组引用的翻译控制流语句的翻译控制流语句及其SDT布尔表达式及其SDT控制流语句翻译的例子布尔表达式和控制流表达式的回填switch语句的翻译过程调…

游戏开发32课 typescript super

super 在类的方法中super就表示当前类的父类。 如果在子类中写了构造函数,在子类构造函数中必须对父类的构造函数进行调用。 例子 (function() { // 父类 class Animal { name: string; constructor(name: string) { this.na…

25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器

我的知识星球 里有一个朋友提出了 SAP OData 服务 metadata 缓存方面的疑问,本文就来详细说一说: jerry,啥时候有时间给介绍一下fiori的Metadata数据系统的处理机制吧。我现在在做的一个项目,用rap开发的。rap开发的service binding,在maintain service注册时,开始注册的…

简单的个人博客网站设计 静态HTML个人博客主页 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页设计作业

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

TEE安全系统SMC深入理解

1、TEE背景在文章开始之前提几个问题:Android手机中至少运行着几个操作系统OS?如何进入安全操作系统?异常等级和安全操作系统之间的关系?SMC调用的实质、约定及流程是什么?随着智能手机的普及,手机上数据的…

R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据

原文链接:http://tecdat.cn/?p5919在本文中,我将介绍ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型如何用于预测时间序列数据(点击文末“阅读原文”获取完整代码数据)。使用滞后算子计算滞后差分…

[附源码]计算机毕业设计JAVA校园网学生成绩查询系统

[附源码]计算机毕业设计JAVA校园网学生成绩查询系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM …

Android面试题——高级开发面试题二

一 面试题概述 回答自己理解的java虚拟机、gc机制Java多线程、线程池集合原理(hashmap,list)java虚引用封装、继承、多态的理解activity生命周期安卓activity和fragment数据传递Handler内存泄漏、内存溢出、内存抖动 原因及解决办法ANR原因以及解决办法性能优化、卡顿优化事件…

xshell与xftp

目录 1.什么是xshell 2.下载xshell与xftp 3.安装与操作xshell 4.什么是xftp 5.安装与操作xftp 6.xshell与xftp互联 1.什么是xshell Xshell是一个强大的安全终端模拟软件,它支持SSH1,SSH2, 以及Microsoft Windows平台的TELNET协议。. …

[Camunda BPMN进阶] 电商订单流程设计与调试

目录 摘要 基于BPMN的软件设计思想 电商订单流程业务场景 基本订单流程BPMN设计 1.最基本流程设计 2. 添加超时未付款自动取消功能 3. 添加15分钟付款提醒 4. 添加用户取消订单事件 进阶订单流程BPMN设计 1. 使用并行网关执行任务 2. 将具有相同事件分支的任务合并…

基于PHP+MySQL月子中心管理系统的设计与实现

月子中心管理系统是信息时代的产物,月子基本是每个适龄女子都会经历的一个特殊时期,尤其是在中国对月子的重视程度尤其的重要,只有让产妇和婴儿受到精心的照顾才能够让产妇更好的康复,才能够让婴儿更好的成长,所以越来越多的人关注到了月子期间的养护问题,为了能够让更多的月子…

安卓APP源码和报告——学生信息管理系统

学生信息管理系统APP演示视频《移动开发技术II》实践考核方案 适用网络工程(网络软件开发)2018级 一、考核内容: 环境配置及移动开发生命周期、控件的使用、用户界面设计、数据存储与访问、广播、服务、网络编程、蓝牙应用等知识点。 二、…