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

目录

一、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.mzph.cn/news/95152.shtml

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

相关文章

OK3568 forlinx系统编译过程及问题汇总

1. 共享文件夹无法加载&#xff1b;通过网上把文件夹加载后&#xff0c;拷贝文件很慢&#xff0c;任务管理器查看发现硬盘读写速率很低。解决办法&#xff1a;重新安装vmware tools。 2. 拷贝Linux源码到虚拟机&#xff0c;解压。 3. 虚拟机基本库安装 forlinxubuntu:~$ sudo…

『力扣每日一题12』:只出现一次的数字

一、题目 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&…

WVP-28181协议视频平台搭建教程

28181协议视频平台搭建教程 安装mysql安装redis安装ZLMediaKit安装28181协议视频平台安装依赖下载源码编译静态页面打包项目, 生成可执行jar修改配置文件启动WVP 项目地址&#xff1a; https://github.com/648540858/wvp-GB28181-pro 说明: wvp-GB28181-pro 依赖redis和mysql中…

案例题--信息系统架构设计

案例题--信息系统架构设计 概念 以扩展了解为主&#xff0c;主要关注图 概念 架构的组成&#xff1a;构件&#xff0c;连接件&#xff0c;约束 构件&#xff1a;组成元素 连接件&#xff1a;构件之间的连接方式 约束&#xff1a;构件和连接件之间的约束 上应&#xff0c;下技&a…

Linux CentOS7 vim多窗口编辑

我们在用vim编辑文件时&#xff0c;有各种需求。如有时需要在多个文件之间来回操作&#xff0c;一会关闭一个文件&#xff0c;一会再打开另外一个文件&#xff0c;这样来回操作显得太笨拙。有时&#xff0c;vim编辑多行的大文件&#xff0c;来回查看、编辑前面一部分及最后一部…

【Axure】元件库和母版、常见的原型规范、静态原型页面制作

添加现有元件库 点击元件库——载入 当然也可以创建元件库&#xff0c;自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例&#xff0c;顶部状态栏高度为20 左侧类似于标尺&#xff0c;因为图标、文字离最左侧的间距是不一样的 信…

基于Kylin的数据统计分析平台架构设计与实现

目录 1 前言 2 关键模块 2.1 数据仓库的搭建 2.2 ETL 2.3 Kylin数据分析系统 2.4 数据可视化系统 2.5 报表模块 3 最终成果 4 遇到问题 1 前言 这是在TP-LINK公司云平台部门做的一个项目&#xff0c;总体包括云上数据统计平台的架构设计和组件开发&#xff0c;在此只做…

深入了解 Linux 中的 AWK 命令:文本处理的瑞士军刀

简介 在Linux和Unix操作系统中&#xff0c;文本处理是一个常见的任务。AWK命令是一个强大的文本处理工具&#xff0c;专门进行文本截取和分析&#xff0c;它允许你在文本文件中查找、过滤、处理和格式化数据。本文将深入介绍Linux中的AWK命令&#xff0c;让你了解其基本用法和…

ElasticSearch第四讲:ES详解:ElasticSearch和Kibana安装

ElasticSearch第四讲&#xff1a;ES详解&#xff1a;ElasticSearch和Kibana安装 本文是ElasticSearch第四讲&#xff1a;ElasticSearch和Kibana安装&#xff0c;主要介绍ElasticSearch和Kibana的安装。了解完ElasticSearch基础和Elastic Stack生态后&#xff0c;我们便可以开始…

数据库的备份与恢复

数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中&#xff0c;数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因&#xff1a; 程序错误人为操作错误运算错误磁盘故障灾难&#xff08;如火灾、地震&#xff09;和盗窃 数据库备份…

XC5013 马达驱动和充电集成一体的控制芯片 一档输出芯片

XC5013 是一款应用于马达驱动或 LED 驱动的控制芯片&#xff0c;集成了锂电池充电管理系统&#xff0c;设定一档高电平输 出&#xff0c;并带有对不同状态的 LED 指示功能。 XC5013 集成了涓流充电、恒流充电和恒压充电全过程的充电方式&#xff0c;浮充电压精度在全温度范…

了解基于Elasticsearch 的站内搜索,及其替代方案

对于一家公司而言&#xff0c;数据量越来越多&#xff0c;如果快速去查找这些信息是一个很难的问题&#xff0c;在计算机领域有一个专门的领域IR&#xff08;Information Retrival&#xff09;研究如何获取信息&#xff0c;做信息检索。在国内的如百度这样的搜索引擎也属于这个…

二叉树经典例题

前言&#xff1a; 本文主要讲解了关于二叉树的简单经典的例题。 因为二叉树的特性&#xff0c;所以关于二叉树的大部分题目&#xff0c;需要利用分治的思想去递归解决问题。 分治思想&#xff1a; 把大问题化简成小问题&#xff08;根节点、左子树、右子树&#xff09;&…

leetCode 53.最大子数和 图解 + 贪心算法/动态规划+优化

53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入…

VUE3照本宣科——路由与状态管理器

VUE3照本宣科——路由与状态管理器 前言一、路由&#xff08;router&#xff09;1.createRouter2.router-link3.router-view4.useRoute5.useRouter6.路由守卫7.嵌套路由 二、状态管理器&#xff08;Pinia&#xff09;1.定义Store&#xff08;1&#xff09;Option Store&#x…

电气走线——部件、线缆、线号、端子排

目录 1.部件 2.线缆 3.端子排 1.部件 元器件选型 2.线缆 3.端子排

【在凸多边形的图像中查找顶点】估计具有已知顶点数的像素化凸多边形角点研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SpringCache--缓存框架 ----苍穹外卖day7

目录 简介 ​快速入门 引入依赖 常用注解​ 使用步骤 1.开启缓存注解 2. Cacheable注解 简介 快速入门 引入依赖 常用注解 使用步骤 1.开启缓存注解 2. Cacheable注解 该注解仅用于查询操作&#xff0c…

深度学习(3)---PyTorch中的张量

文章目录 一、张量简介与创建1.1 简介1.2 张量的创建 二、张量的操作2.1 张量的拼接与切分2.2 张量索引 三、张量的数学运算 一、张量简介与创建 1.1 简介 1. 张量是一个多维数组&#xff0c;它是标量、向量、矩阵的高维拓展。 2. 在张量的定义中&#xff0c;方括号用于表示张…

1.3 数据库系统的结构

前言&#xff1a; **前言笔记&#xff1a;数据库系统的结构层次与角度** --- **1. 数据库系统的结构考察**&#xff1a; - 可以从多种层次和不同角度来考察。 - 结构的选择取决于我们查看数据库的角度。 --- **2. 从** **开发人员** **的角度**&#xff1a; - **…