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.rhkb.cn/news/147709.html

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

相关文章

GPT系列论文解读:GPT-1

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…

数据分析:人工智能篇

文章目录 第三章 数据可视化库matplotlib3.1 matplotlib基本绘图操作3.2 plot的线条和颜色3.3 条形图分析3.4 箱型图分析3.5 直方图分析3.6 散点图分析3.7 图表的美化 第四章 数据预测库Sklearn4.1 sklearn预测未来4.2 回归数据的预测4.2.1 回归数据的切分4.2.2 线性回归数据模…

SpringBoot整合RocketMQ笔记

SpringBoot版本为2.3.12.Release RocketMQ对比kafka 学习链接 https://zhuanlan.zhihu.com/p/335216381 代码实战 https://www.cnblogs.com/RedOrange/p/17401238.html Centos安装rocketmq https://blog.csdn.net/chuige2013/article/details/123783612 RocketMQ详细配置与…

怎么将本地代码文件夹通过Git 命令上传到启智平台仓库

在本地创建一个与启智平台仓库同样名字的文件夹 然后在本地文件夹右键–>选择Git Bash Here,就会打开Git命令窗口 初始化本地仓库 git init将项目文件添加到Git git add .提交更改&#xff1a; 使用以下命令提交您的更改&#xff0c;并为提交添加一条描述性的消息&#…

大数据Flink(九十六):DML:Deduplication

文章目录 DML:Deduplication DML:Deduplication Deduplication 定义(支持 Batch\Streaming):Deduplication 其实就是去重,也即上文介绍到的 TopN 中 row_number = 1 的场景,但是这里有一点不一样在于其排序字段一定是时间属性列,不能是其他非时间属性的普通列。在 ro…

嵌入式Linux应用开发-驱动大全-同步与互斥②

嵌入式Linux应用开发-驱动大全-同步与互斥② 第一章 同步与互斥②1.3 原子操作的实现原理与使用1.3.1 原子变量的内核操作函数1.3.2 原子变量的内核实现1.3.2.1 ATOMIC_OP在 UP系统中的实现1.3.2.2 ATOMIC_OP在 SMP系统中的实现 1.3.3 原子变量使用案例1.3.4 原子位介绍1.3.4.1…

《Vue.js+Spring Boot全栈开发实战》简介

大家好&#xff0c;我是老卫。 恰逢中秋国庆双节&#xff0c;不想出门看人山&#xff0c;惟愿宅家阅书海&#xff01; 今天开箱的这本书是《Vue.jsSpring Boot全栈开发实战》。 外观 从书名故名思议&#xff0c;就是基于Vue.jsSpring Boot来实现企业级应用全栈开发。 该书由…

【单片机】16-LCD1602和12864显示器

1.LCD显示器相关背景 1.LCD简介 &#xff08;1&#xff09;显示器&#xff0c;常见显示器&#xff1a;电视&#xff0c;电脑 &#xff08;2&#xff09;LCD&#xff08;Liquid Crystal Display&#xff09;&#xff0c;液晶显示器&#xff0c;原理介绍 &#xff08;3&#xff…

设计模式11、享元模式Flyweight

解释说明&#xff1a;享元模式&#xff08;Flyweight Pattern&#xff09;运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象&#xff0c;而这些对象都很相似&#xff0c;状态变化很小&#xff0c;可以实现对象的多次复用。 抽象享元类&#xff08;Flyweight&…

Spring MVC:数据绑定

Spring MVC 数据绑定数据类型转换数据格式化数据校验 附 数据绑定 数据绑定&#xff0c;指 Web 页面上请求和响应的数据与 Controller 中对应处理方法上的对象绑定&#xff08;即是将用户提交的表单数据绑定到 Java 对象中&#xff09;。 过程如下&#xff1a; ServletRequest…

python和java类的编写(属性私有化,方法公开化)

初始化类的属性的2种写法&#xff1a; 如下要注意python对文件名称、类、方法名的命名 方式一&#xff1a;原始的定义 class User1: # 初始化账号和密码 def __init__(self):# 账号和密码self.__username Noneself.__password Nonedef getnsername(self):return self.__us…

服务网关Gateway_入门案例

创建cloud-gateway-gateway9527工程 pom文件引入依赖 <dependencies><!-- 引入网关Gateway依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></depe…

用向量数据库Milvus Cloud搭建检索知识库机器人

检索知识库 Milvus 中已经存储了文本块向量,现在可以进行向量查询了。 以下函数创建了 1 个查询 pipeline。注意,这是本教程中最为关键的一个步骤! ops.ann_search.osschat_milvus(host=MILVUS_HOST, port=MILVUS_PORT, **{metric_type: IP, limit: 3, output_fields: [text…

STM32CubeMX学习笔记-USB接口使用(HID按键)

STM32CubeMX学习笔记-USB接口使用&#xff08;HID按键&#xff09; 一、USB简介1.1 USB HID简介 二、新建工程1. 打开 STM32CubeMX 软件&#xff0c;点击“新建工程”2. 选择 MCU 和封装3. 配置时钟4. 配置调试模式 三、USB3.1 参数配置3.2 引脚配置3.3 配置时钟3.4 USB Device…

【SimpleDateFormat】线程不安全问题分析及解决方案

前言 在日常开发中&#xff0c;我们经常需要去做日期格式转换&#xff0c;可能就会用到SimpleDateFormat类。但是&#xff0c;如果使用不当&#xff0c;就很容易引发生产事故&#xff01; 1. 问题推演 1.1 初始日期工具类 刚开始的日期转换工具类可能长这样&#xff1a; p…

设计模式2、抽象工厂模式 Abstract Factory

解释说明&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定他们具体的类。 简言之&#xff0c;一个工厂可以提供创建多种相关产品的接口&#xff0c;而无需像工厂方法一样&#xff0c;为每一个产品都提供一个具体工厂 抽象工厂&#xff08;Abstra…

知识图谱02——使用python将信息录入neo4j

将文档传入chatgpt&#xff0c;生成对应的cypher语句 链接: https://pan.baidu.com/s/1Ny-ttbBSpqYEigwYiCWMeA?pwdc7sc 提取码: c7sc 使用命令行安装对应的包 pip install neo4jchatgpt生成出的txt文档中的内容如下&#xff1a; MERGE (Node1:Entity {name: 原始舱单提运单…

Redis BitMap+SpringBoot 实现签到与统计功能

前言&#xff1a; 在各个项目中&#xff0c;我们都可能需要用到签到和 统计功能。签到后会给用户一些礼品以此来吸引用户持续在该平台进行活跃。 签到功能&#xff0c;使用 Redis 中的 BitMap 功能来实现&#xff0c;就是一个非常不错的选择。 一、Redis BitMap 基本用法 Bi…

如何在 Elasticsearch 中使用 Openai Embedding 进行语义搜索

随着强大的 GPT 模型的出现&#xff0c;文本的语义提取得到了改进。 在本文中&#xff0c;我们将使用嵌入向量在文档中进行搜索&#xff0c;而不是使用关键字进行老式搜索。 什么是嵌入 - embedding&#xff1f; 在深度学习术语中&#xff0c;嵌入是文本或图像等内容的数字表示…

nodejs+vue晓海网上订餐系统elementui

管理员功能需求 管理员登陆后&#xff0c;主要模块包括首页、个人中心、用户管理、菜单信息管理等功能。 第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术可行性&#xff1a;技术背景 10 3.2.2经济可行性 11 3.2.3操作可行性&#xff1a; 11 3.3性能分析 11 3.4…