SpringCloud Alibaba - Sentinel 微服务保护解决雪崩问题、Hystrix 区别、安装及使用

news2025/1/8 5:09:14

目录

一、Sentinel

1.1、背景:雪崩问题

1.2、雪崩问题的解决办法

1.2.1、超时处理

缺陷:为什么这里只是 “缓解” 雪崩问题,而不是百分之百解决了雪问题呢?

1.2.2、舱壁模式

缺陷:资源浪费

1.2.3、熔断降级

1.2.4、流量控制

误区:那是不是只用流量控制就可以,前面三种方法就不用了?

1.3、Sentinel 和 Hystrix 的区别

a)隔离策略

b)熔断降级

c)限流

d)流量整形

e)控制台

1.4、安装 Sentinel

1.5、微服务项目整合 Sentinel

1.5.1、引入微服务工程

1.5.2、整合 Sentinel


一、Sentinel


1.1、背景:雪崩问题

雪崩问题,就是指在微服务调用链路中,某个服务出现故障,结果引起整个链路的所有微服务都不可用.

在微服务中,业务往往会比较复杂,一业务服务可能会依赖多个服务. 比如有一个 服务a 内部会依赖 服务b、服务c、服务d.  现在假设 服务d 出现了故障,那么 服务a 依赖于 服务d 的请求还能正常响应吗?显然不能,请求来了以后,就要等待 服务d 的响应,因为 服务d 出现故障了以后不能正常返回响应,因此就会阻塞在这里,导致 服务a 内部的业务阻塞在这里. 也就不会释放 tomcat 连接.

此时,服务a 内部依赖的 服务b 或 c 的业务还可以正常运行,但是如果依赖于 服务d 的请求肯定后续还会有多个,他们都不会释放连接,就导致把 a 内部所有连接都占用了,连接资源也就耗尽了,此时,就导致依赖的 b 和 c 的服务故障了.  

这还不是最严重的,在微服务的调用关系中很复杂,也就是说,会有其他服务也依赖于 a 服务,进一步导致其他依赖 a 的服务故障,最后整个微服务群就垮了.

1.2、雪崩问题的解决办法

1.2.1、超时处理

超时处理:设定一个超时时间,当请求超过一定时间没有响应时,就直接返回错误信息,而不是无休止等待.

就拿刚才的栗子讲,服务a 内部依赖 b、c、d,此时 d 出现了故障,a 内部依赖于 c 的所有业务都会阻塞,假以时日 a 也就崩溃了. 那么 超时处理 会怎么做呢?

他会在调用的业务上加一个超时时间,比如说 1s,也就是说,a 依赖于 d 的业务他最多等 1s.  当 d 故障了以后,等待时间超过 1s,他就会立即结束这个请求,不再等待返回,会给用户提示请求失败,那么这个就不会导致一直占用连接资源,可以一定程度上缓解雪崩问题.

缺陷:为什么这里只是 “缓解” 雪崩问题,而不是百分之百解决了雪问题呢?

假设他只是等待 1s 以后把资源释放了,也就是说,1s 释放一个连接,那么如果现在请求来的速度比他释放的还要快(比如 500ms 一个请求),那么终有一天,服务a 的资源也有可能被耗尽(就像是一个蓄水池,进水的速度比出水快,终有一日,水池的水会溢出).

因此 超时处理 并不能从根本上解决这个问题.

1.2.2、舱壁模式

舱壁模式的涉及来源于我们现实生活中~  一些大型的轮船,会利用隔板(也叫舱壁)把船体分隔成一个个独立的小空间,因此空间彼此之间时隔离的. 假设现在船体的某个部位撞上了冰山漏水了,那么最多也只是把部分船舱给他填满水了,不会导致整个船体挂满水,最后导致沉船,提高了整艘船的容灾能力.

在程序涉及这边的做法是,把 tomcat 看成整艘船,限定每个业务能使用的线程数(相当于舱壁隔离),避免耗尽整个 tomcat 资源,因此这个方法也叫做“线程隔离”.

这里还是拿刚刚的栗子来讲,假设限定每个业务分配一个线程池,限定线程最大数目为 10,此时 服务d 故障了,那么他最多也就只能占用 10 个连接资源,避免占用其他业务的连接资源.

缺陷:资源浪费

这种模式确实解决了雪崩问题,但是资源上还是会有一定的浪费,比如 服务d 真的宕机了,明明知道他挂了,但请求还是回来,直到占满 10 个线程.  因此对 cpu 的资源也是一种浪费.

1.2.3、熔断降级

这种模式中会有一个 断路器,它可以用来统计业务出现 故障的请求 和 正常请求 之间的比例是什么样子,如果超出来看阈值,就会熔断该业务,拦截访问该业务的所有请求.

拿之前的栗子讲,服务a 里有一个业务时访问 服务d 的,然后呢第一次访问时正常的,结果后面两次都出现了故障,这个时候熔断器就会统计这个异常比例是怎么样的.  假设阈值时 50%,而三个请求中,两个都出了问题,肯定超出了阈值,这个时候就会出现熔断,那么在 服务a 内部,访问 服务d 的业务都会被拦截下来,然后快速释放资源. 

这种方式不仅解决了雪崩问题,也解决了 舱壁模式 中,资源浪费的情况.  因此,熔断降级模式是解决雪崩问题中比较好的一种方案.

1.2.4、流量控制

流量控制就是限制业务访问的 qps(每秒处理请求数量),避免服务因流量突增而故障.

比如有一个微服务能承受的最大 qps 是 2,也就是每秒钟最多处理两个请求,但是现在有一百个请求涌过来了,那他不得被达成筛子了,但是 sentinel 会根据这个 qps 的限制,去处理请求然后释放(这就像是有大量的水要涌入的时候,会先经过一个漏斗,通过这个漏斗,将水的流量限制住),这个时候,就可以有效的避免出现故障(超出的请求会被拦截,默认会报错,但也可以配置成 排队等待、预热).

流量控制和前面三种方法不同,前面三种方法是服务已经有故障了,而流量控制是通过限制 qps,避免出现故障.

误区:那是不是只用流量控制就可以,前面三种方法就不用了?

当然不是,因为高并发引起的服务故障只是故障的原因之一,服务往往还会因为其他问题而引发故障,比如网络问题,或者是假死问题.

但是以上三种解决方式中,我们重点学习的是 舱壁模式、熔断降级、流量控制.

1.3、Sentinel 和 Hystrix 的区别

Hystrix 是 SpringCloud 刚刚流行的这几年,推荐大家使用的服务保护机制,是由 Netflix 公司出品的,只不过后来这个公司宣布停止对 Hystrix 的升级和维护,逐渐就没落了,于是人们都开始寻找一种新的方案.

这个时候,阿里巴巴开源了一个项目就是 sentinel ,并且成为了 SpringCloud 中服务保护的组件,现在已经广泛的应用在国内的互联网公司.

这里我们来对比一下他们两个.

Sentinel

Hystrix

隔离策略

信号量隔离

线程池隔离/信号量隔离

熔断降级策略

基于慢调用比例或异常比例

基于失败比率

实时指标实现

滑动窗口

滑动窗口(基于 RxJava)

规则配置

支持多种数据源

支持多种数据源

扩展性

多个扩展点

插件的形式

基于注解的支持

支持

支持

限流

基于 QPS,支持基于调用关系的限流

有限的支持

流量整形

支持慢启动、匀速排队模式

不支持

系统自适应保护

支持

不支持

控制台

开箱即用,可配置规则、查看秒级监控、机器发现等

不完善

常见框架的适配

Servlet、Spring Cloud、Dubbo、gRPC

Servlet、Spring Cloud Netflix

主要是红字的差异.

a)隔离策略

hystrix 底层是基于线程池和信号量实现的,默认情况下是使用线程池. sentinel 底层是基于信号量来实现的.  这两种方式有什么差别呢?

线程池隔离就是给每一个业务链上都有一个独立的线程池来处理请求,但是一旦请求数量突增,就会导致多出很多线程,因此会给 cpu 带来一些额外的上下文切换的消耗(线程不是越多越好,就像之前讲过的 “一群滑稽吃鸡” 的栗子).

信号量隔离就不会创建单独的线程池,而是使用一个大线程池,在请求来了之后做一个统计,统计当前业务已经使用了几个线程了,然后限制一下当前业务使用的线程数目,例如只能使用 10 个,假设你也已经使用了 10 个,那么再有新的业务来获取线程的时候,就会阻止你. 池子就是那一个池子,他默认不会创建新的线程,因此性能不受影响.

这种方式相比于 线程池隔离,隔离性略微逊色一点,因此比较在同一个池子里,只不过一个大锅饭,每个人拿单独的碗成了,性能比较高.  因此我们认为信号量这种方案更好一点.

b)熔断降级

在 sentinel 中除了可以统计异常请求的比例,也可以统计慢调用的比例. 什么是慢调用呢?

就是一个业务中,10 个请求中有 8 个耗时都比较久,可能导致拖慢整个服务,因此这个时候就会去他熔断掉.

c)限流

在 sentinel 中,是支持基于 qps 限流、调用关系限流、甚至还可以针对热点的参数去限流.

而在 hystrix 中,没有专门的限流控制,只是基于线程池,设置池子的线程数上限来限流.

d)流量整形

在 sentinel 中,支持流量整形,就是让基于 慢启动(预热模式 或者 匀速排队) 让突发流量变成稳定的流速.

而 hystrix 中是不支持这样的功能的.

e)控制台

控制台也就是所谓的 可视化界面,方便你去操作.

在 sentinel 中,控制台这边不仅可以监控微服务,查看运行状态,还可以配置我们的降级规则,先流规则,并且设置完立即动态生效.

在 hystrix 中,控制台只支持查看服务状态的功能.

因此相对来讲,sentinel 控制台的功能要强大一些.

1.4、安装 Sentinel

Sentinel 官方提供了 UI 控制台,方便我们对系统做限流设置.

a)大家可以去 GitHub 上下载.

git clone https://github.com/alibaba/Sentinel.git

b)下载好 jar 包以后,把他拷贝到一个非中文的目录,然后打开终端,使用以下命令:

java -jar sentinel-dashboard-1.8.1.jar

 Ps:官方教程中使用的端口是8080,用户可以自定义更改.

 如果要修改 Sentinel 的默认端口、账户、密码、可以通过以下配置

配置项

默认值

说明

server.port

8080

服务端口

sentinel.dashboard.auth.username

sentinel

默认用户名

sentinel.dashboard.auth.password

sentinel

默认密码

例如,修改端口号为 8090

java -jar sentinel-dashboard-1.8.1.jar -Dserver.port=8090

c)然后访问:localhost:8080 即可看到控制台页面,默认的账户和密码都是sentinel


登录成功以后,可以看到只有一个欢迎页面,这是因为我们还没有在微服务中配置 Sentinel 的信息.

1.5、微服务项目整合 Sentinel

1.5.1、引入微服务工程

项目结构如下:

  1. gateway:网关.
  2. user-service:用户服务(涉及到用户表),包含用户的 CRUD.
  3. order-service:订单服务(涉及到订单表),查询订单 的时候会远程调用 用户服务 ,将订单和用户信息一起展示出来.
  4. feign-api:用户服务对外暴露 feign 客户端、实体类.

用户表如下:

订单表如下:

1.5.2、整合 Sentinel

在 order-service 中整合 Sentinel,并且连接 Sentinel 控制台,步骤如下.

a)在 order-service 中引入 sentinel 依赖

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

b)配置控制台地址

spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8080

c)访问 order-service 服务的任意端点,触发 sentinel 监控.

Ps:启动微服务前,记得启动 nacos 和 sentinel.

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

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

相关文章

【汇编的救赎】汇编语言入门必看基本知识点

汇编语言是一种低级语言&#xff0c;用于编写计算机程序。它直接操作计算机硬件&#xff0c;提供了对处理器寄存器、内存和指令等底层资源的直接访问。汇编语言的语法简单明了&#xff0c;每条指令都对应着一条机器指令&#xff0c;具有高度的灵活性和效率。通过汇编语言&#…

MySQL SQL性能分析(SQL优化 一)

在开发和维护数据库应用程序时&#xff0c;优化SQL查询的性能是至关重要的。MySQL提供了一些强大的工具和技术&#xff0c;帮助我们进行SQL性能分析&#xff0c;找出潜在的瓶颈并进行相应的优化。 查看SQL的执行频率 show [ session| global ] status 命令查看服务器状态信息…

web:[RoarCTF 2019]Easy Calc

题目 进入页面是一个计算器的页面 随便试了一下 查看源代码看看有什么有用的信息 访问一下这个calc.php 进行代码审计 <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str $_GET[num];$blacklist [ , \t, \r, \n,\, ", , \[, \]…

Python语言:函数的使用

按我的理解&#xff0c;编程世界中的函数就是一个模块&#xff1a;提前写好一个特动功能&#xff0c;方便以后直接调用且实现其功能&#xff0c;可以大大提高工作效率。 今天我们通过一个python语言的函数使用小案例来进一步加深对函数的理解。案例名字为S的银行之行。S是一个吝…

1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计

项目完整版在&#xff1a; 文章目录 一、channel模块&#xff1a;事件管理Channel类实现二、提供的功能三、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 四、代码&#xff08;一&#xff09;框架&#xff08;二…

Mac卸载不了软件怎么办?2023年最新MacBook卸载大集合

很多朋友在卸载软件的时候&#xff0c;可能会遇到卸载不了的情况。软件正在使用、软件来自第三方等原因都可能导致我们无法将其成功卸载。本篇文章就将告诉您“Mac卸载不了软件”的解决办法。 为什么Mac卸载不了软件&#xff1f; Mac卸载不了软件的原因很多&#xff0c;常见的…

Excel如何快速将表格纵向数据变成横向

第一&#xff0c;打开Excel文件&#xff0c;我们看到表格里面的内容为纵向排列&#xff1b; 第二&#xff0c;要将表格纵向排列变成横向&#xff0c;首先选中单元格内容&#xff0c;按CTRLC快速复制。 第三&#xff0c;选中一个空白单元格&#xff0c;点击鼠标右键&#xff0c;…

SentenceTransformer 之论文解读

摘要 原文标题&#xff1a;Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks 链接&#xff1a;https://arxiv.org/pdf/1908.10084.pdf 尽管Bert和RoBERTa在句子对回归任务上&#xff0c;例如语义文本相似度&#xff08;Semantic Text Similarity&#xff09;…

300元以内最好的开放式耳机是哪款、百元开放式耳机推荐

如果你是一位运动用户&#xff0c;或者耳道比较敏感的用户&#xff0c;耳机一定要选开放式的。开放式耳机的优点是在听歌的能够兼顾环境音&#xff0c;避免户外运动时出现的安全问题。在耳机的佩戴上舒适性上也比入耳式耳机好&#xff0c;不会对耳朵造成压迫导致不适。不足是音…

高效记录,事项井然——OmniOutliner 5 Pro for Mac 信息大纲记录工具

OmniOutliner 5 Pro for Mac 是一款强大的信息大纲记录工具&#xff0c;帮助您高效组织和管理各种信息。无论是个人笔记、工作计划、项目管理还是学习资料&#xff0c;这款应用都能满足您的需求&#xff0c;并使您的日常工作更加井然有序。 OmniOutliner 5 Pro 提供了一套丰富…

为何每个开发者都在谈论Go?

目录 一、引言Go的历史回顾关键时间节点 使用场景Go的语言地位技术社群与企业支持资源投入和生态系统 二、简洁的语法结构基本组成元素变量声明与初始化代码示例 类型推断函数与返回值代码示例输出 接口与结构体&#xff1a;组合而非继承错误处理&#xff1a;明确而不是异常小结…

什么是数据库锁(Lock)?有哪些类型的锁

数据库锁&#xff08;Lock&#xff09;&#xff1a;保护数据完整性与并发性的关键 数据库锁&#xff08;Lock&#xff09;是在数据库管理系统中用于管理并发访问数据的重要机制。它们确保了多个用户或事务可以同时访问数据库&#xff0c;同时保护数据的完整性。在本文中&#…

JJJ:添加开机自启动项

比如我希望一个截图软件能开机自启动&#xff1a; 1、打开任务管理器&#xff1a; 进入启动栏&#xff1a; 发现没有snipaste可以设置 2、win r&#xff0c; 输入 shell:startup 然后回弹出一个新的窗口&#xff0c;把截图软件的快捷方式放里头 这样snipaste就能开机自启动…

Python报错:KeyError: ‘820‘

Python报错&#xff1a;KeyError: ‘820’ 问题描述 原因 操作的表格列名是数字 NIRdata[820] Rdata[630]以上是出错行&#xff0c;dataframe的这种索引方式不支持用数字。 解决方案 先修改列名为字符 然后将出错行改为对应列名 NIRdata[nir] Rdata[r]

QSS之QLineEdit

QLineEdit我们在开发过程中是经常使用的&#xff0c;一般情况下默认的风格是不适合设计师的要求&#xff0c;本篇介绍QLineEdit的基本qss风格&#xff1a; 1.基本属性设置 QLineEdit{background-color:#FFFFFF;color:#333333;border:none;} 2.悬浮状态设置 QLineEdit:hover…

亲和力的作用,以及提高亲和力的六个办法

亲和力指的是容易使人亲近&#xff0c;当人身处集体中&#xff0c;亲和力也即是影响力和凝聚力的体现。通常是在职场中会明确对亲和力的考评&#xff0c;尤其是某些管理型岗位&#xff0c;所以HR人力资源管理中对亲和力有详细的评级标准。不过这里小猫测试网不详细讨论亲和力的…

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_9.3p2(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

[Java·算法·困难]LeetCode124.二叉树中的最大路径和

每天一题&#xff0c;防止痴呆 题目示例分析思路1题解1 &#x1f449;️ 力扣原文 题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经…

第七章 查找 七、红黑树

一、为什么要发明红黑树 因为&#xff1a; 平衡二叉树AVL:插入/删除很容易破坏“平衡”特性&#xff0c;需要频繁调整树的形态。如:插入操作导致不平衡&#xff0c;则需要先计算平衡因子&#xff0c;找到最小不平衡子树&#xff08;时间开销大&#xff09;&#xff0c;再进行L…

Ubuntu配置深度学习环境(TensorFlow和pyTorch)

文章目录 一、CUDA安装1.1 安装显卡驱动1.2 CUDA安装1.3 安装cuDNN 二、Anaconda安装三、安装TensorFlow和pyTorch3.1 安装pyTorch3.2 安装TensorFlow2 四、安装pyCharm4.1 pyCharm的安装4.2 关联anaconda的Python解释器 五、VScode配置anaconda的Python虚拟环境 前言&#xff…