当前位置: 首页 > news >正文

SpringCloud Alibaba 微服务(四):Sentinel

目录

前言

一、什么是Sentinel?

 Sentinel 的主要特性

Sentinel 的开源生态

二、Sentinel的核心功能

三、Sentinel 的主要优势与特性

1、丰富的流控规则

 2、完善的熔断降级机制

3、实时监控和控制台

4、多数据源支持

5、扩展性强

四、Sentinel 与 Hystrix 的对比

五、Sentinel安装与使用

1、Sentineal 控制台下载与安装

2、给服务接入sentinel监控

3、流控规则

接口限流

直接流控模式

关联流控模式

链路流控模式

主要概念

使用场景

4、@SentinelResource注解

基本用法

使用示例

注意事项

总结


前言

随着微服务架构的普及,如何保证系统的高可用性和稳定性成为开发者必须面对的重要课题。阿里巴巴开源的 Sentinel 作为一款流量防护组件,提供了熔断、限流、降级等多种功能,帮助开发者提升系统的容错能力。本文将记录 Sentinel 的核心功能及其在 Spring Cloud 中的集成和使用。也希望本文,能够帮助你们在微服务项目中轻松地集成和使用 Sentinel,提升系统的稳定性和容错能力。


一、什么是Sentinel

Sentinel 是阿里巴巴开源的流量防护组件,专注于流量控制和系统稳定性保护。它提供了丰富的功能,如限流、熔断降级、系统自适应保护、实时监控等,帮助开发者构建高可用和高稳定性的微服务系统。

中文官网:home | Sentinel (sentinelguard.io)

 Sentinel 的主要特性

Sentinel 的开源生态

二、Sentinel的核心功能

限流:通过多种流量控制策略,实现对热点数据、分布式请求等的限流。

熔断降级:根据调用错误比例、RT(响应时间)等指标,对不稳定的服务进行熔断,避免级联故障。

系统自适应保护:根据系统的负载情况,动态调整限流和熔断策略,保证系统在高负载下的稳定性。

实时监控:提供实时的监控与报警功能,帮助开发者及时发现和处理问题。

三、Sentinel 的主要优势与特性

1、丰富的流控规则

流量整形:支持匀速排队、预热、并发等多种流控策略。
热点参数限流:针对传入参数进行热点数据的限流保护。
系统自适应保护:根据系统的负载情况,动态调整限流和熔断策略。

 2、完善的熔断降级机制

基于错误比例:在指定时间窗口内,如果请求的错误比例超过阈值,则触发熔断。
基于响应时间:在指定时间窗口内,如果请求的平均响应时间超过阈值,则触发熔断。

3、实时监控和控制台

实时监控:提供对实时流量、调用关系、链路流量等多维度的监控。
控制台:通过可视化的 Dashboard,实时配置和管理限流、熔断规则。

4、多数据源支持

规则动态更新:支持从 Nacos、Apollo、ZooKeeper 等多个数据源动态加载和更新规则。

5、扩展性强

SPI 扩展:提供 SPI 扩展点,可以自定义流控、熔断、降级等策略。

四、Sentinel 与 Hystrix 的对比

特性SentinelSpring Cloud Hystrix
限流提供丰富的限流策略,如预热、匀速排队、并发控制等不支持
熔断机制支持基于错误比例、响应时间、异常数量等多种熔断策略主要基于错误比例和响应时间
实时监控提供完整的实时监控和可视化控制台需要集成 Turbine 和 Hystrix Dashboard
规则动态配置支持多种数据源(如 Nacos、Apollo、ZooKeeper)动态配置规则通过 Archaius 实现,灵活性相对较低
扩展性提供丰富的 SPI 扩展点,方便自定义策略扩展性相对较差
社区活跃度社区活跃,持续更新2018 年 Netflix 宣布进入维护模式,社区活跃度降低
依赖轻量级,无需依赖额外组件需要依赖 Hystrix Dashboard 和 Turbine 进行监控

Sentinel 和 Spring Cloud Hystrix 都是优秀的服务保护工具,但各有特点。Sentinel 提供了更丰富的限流策略、动态规则配置和实时监控功能,并且具有更高的扩展性。相比之下,Hystrix 在熔断和降级方面也有较好的表现,但由于Hystrix进入维护模式,其社区活跃度和新特性支持有所降低。

在选择时,可以根据具体需求和项目特点进行权衡。如果需要更强的限流能力、动态规则配置和实时监控,建议选择 Sentinel。如果项目已经使用 Hystrix 并且稳定运行,也可以继续使用 Hystrix。

五、Sentinel安装与使用

1、Sentineal 控制台下载与安装

下载地址:Releases · alibaba/Sentinel (github.com)

选择jar包下载

通过CMD命令运行

java -jar sentinel-dashboard-1.8.8.jar

如下图所示,则已启动成功。

访问地址:localhost:8080

账号密码:都是sentinel

2、给服务接入sentinel监控

引入依赖

<!-- sentinel -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>${spring-cloud-alibaba.version}</version>
</dependency>

如果版本不对的话,运行会报错,sentinel依赖时与web依赖形成循环依赖。

附上完整的maven依赖

<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><!-- spring boot --><spring-boot.version>2.7.5</spring-boot.version><!-- spring cloud --><spring-cloud.version>2021.0.1</spring-cloud.version><spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><spring-cloud-starter-alibaba-nacos-config.version>2.1.4.RELEASE</spring-cloud-starter-alibaba-nacos-config.version>
</properties>

配置sentinel

server:port: 9090spring:application:name: demo-usercloud:nacos:discovery:server-addr: 192.168.1.85:8848namespace: democonfig:server-addr: 192.168.1.85:8848prefix: ${spring.application.name}file-extension: ymlnamespace: demosentinel:transport:dashboard: localhost:8080    #配置sentinel dashboard地址

重启服务,访问接口localhost:9090/hello/getOrder

这时候在控制台就可以看到我们的请求了,证明已经监控到我们服务

3、流控规则

流控规则属性

资源名: 唯一名称,默认请求路径,表示对该资源进行流控
针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
阈值类型/单击阈值:
QPS:(每秒钟的请求数量):当调用该api的QPS达到阈值时,进行限流
线程数:当调用该线程数达到阈值的时候,进行限流
是否集群:不需要集群
流控模式:
直接: api达到限流条件时,直接限流
关联: 当关联的资源达到阈值时,就限流自己
链路: 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
流控效果:
快速失败: 直接失败,抛异常
Warm Up: 根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFctor,经过预热时长,才达到设置的QPS阈值
排队等待: 匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

接口限流

直接流控模式

新增流控规则

资源名指的是我们的接口地址,QPS设置为1,其他都选择默认值。保存后,我们测试接口调用。

第一次请求是正常响应的。

接下来我们快速请求接口,一秒钟点击多次
发现已经被限流了。

关联流控模式

当关联的资源达到阈值时,就限流自己,也就是说关联的资源(接口),QPS为1时,一秒内被多次请求的时候,自己的接口就会被限流。

如图所示,hello/addOrder 接口并发请求,hello/getOrder接口就被限流了。

链路流控模式

链路流控模式(Chain Mode)是 Sentinel 提供的一种流控模式,主要用于控制资源在特定调用链路上的访问频率。与一般的直接流控模式不同,链路流控模式通过定义调用链路来实现更细粒度的流量控制。这对于复杂的分布式系统中,尤其是微服务架构中,控制不同调用路径的流量非常有用。

主要概念

在链路流控模式下,流控规则会对特定的调用链路进行控制。调用链路通常由一个入口资源和一个目标资源组成,表示从入口资源到目标资源的一条特定调用路径。

使用场景

同一资源多入口:当一个资源可以通过多个入口访问时,可以针对不同入口设置不同的流控规则。

细粒度流控:对于某些关键资源,可以根据不同的调用链路进行更细粒度的流量控制,从而实现精细化管理。

示例:

假设有一个系统,其中有一个服务 orderService,它可以通过两个不同的入口资源 getOrder 和 getOrder2 被调用。我们希望限制通过 getOrder2 入口对 orderService 的调用频率。

4、@SentinelResource注解

@SentinelResource 是 Sentinel 提供的一个注解,用于定义资源并为其配置流控、熔断等规则。在方法上使用 @SentinelResource 注解,可以实现对该方法的流控、降级以及异常处理等功能。

基本用法

 @SentinelResource 的基本属性包括 value、blockHandler、fallback 等。以下是它的常用属性及使用示例:

1. value(必填)
描述: 指定资源名称。该名称将作为 Sentinel 的资源标识,用于进行流控和降级保护。
类型: String
2. blockHandler
描述: 指定当资源被流控(如限流、降级)时的处理方法。该方法必须与原方法在同一个类中,或者在公共类中。方法签名要求一致,并且最后一个参数必须是 BlockException。
类型: String
3. blockHandlerClass
描述: 指定 blockHandler 所在类。如果 blockHandler 方法不在同一个类中,可以通过 blockHandlerClass 指定类。
类型: Class<?>
4. fallback
描述: 指定当资源执行发生异常时的处理方法。方法签名要求与原方法一致,或者额外带一个 Throwable 类型的参数用于接收异常。
类型: String
5. fallbackClass
描述: 指定 fallback 所在类。如果 fallback 方法不在同一个类中,可以通过 fallbackClass 指定类。
类型: Class<?>
6. defaultFallback
描述: 指定通用的默认降级方法,当未指定 fallback 方法或 fallback 方法不可用时,调用此方法。方法必须是静态的,且返回类型与原方法一致。
类型: String
7. exceptionsToIgnore
描述: 指定不会触发 fallback 处理的异常列表。
类型: Class<? extends Throwable>[]
8. exceptionsToTrace
描述: 指定会触发 fallback 处理的异常列表。默认情况下,所有的异常都会触发 fallback。
类型: Class<? extends Throwable>[]

使用示例

示例1:

在这个示例中,当访问 /hello 接口时,若触发了流控规则,handleBlock 方法会被调用返回处理结果。helloResource指的就是流控规则的资源名

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")@SentinelResource(value = "helloResource", blockHandler = "handleBlock")public String hello() {return "Hello, Sentinel!";}public String handleBlock(BlockException ex) {return "请求已被阻止!";}
}

示例2:

当 /test 接口在执行过程中抛出异常时,会调用 fallbackMethod 方法进行处理。

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class FallbackController {@GetMapping("/test")@SentinelResource(value = "testResource", fallback = "fallbackMethod")public String test() {if (Math.random() > 0.5) {throw new RuntimeException("出错");}return "成功";}public String fallbackMethod(Throwable ex) {return "Fallback: " + ex.getMessage();}
}

示例3:

在这个例子中,当资源触发流控时,将调用 ExternalHandler 类中的 externalBlockHandler 方法进行处理。

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ExternalHandlerController {@GetMapping("/external")@SentinelResource(value = "externalResource", blockHandler = "externalBlockHandler", blockHandlerClass = ExternalHandler.class)public String external() {return "这是个示例";}
}class ExternalHandler {// 必须为静态方法public static String externalBlockHandler(BlockException ex) {return "请求已被阻止";}
}
注意事项

blockHandler 和 fallback 方法的签名要求: 这些方法必须和原方法签名一致,blockHandler 方法额外需要接收一个 BlockException 参数,而 fallback 方法可以选择性地接收一个 Throwable 参数。
defaultFallback: 作为全局降级处理方法,必须是 public static 方法,并且参数和返回类型与原方法一致。
处理类的类加载顺序: 如果使用 blockHandlerClass 或 fallbackClass 指定外部类,这些类必须在项目启动时能够被加载。


总结

本文介绍了 Sentinel 的核心功能及其在 Spring Cloud 中的集成和使用。Sentinel 提供了丰富的流量控制和系统保护功能,帮助开发者提升系统的容错能力和稳定性。希望通过本文的学习,能够帮助你更好地理解和使用 Sentinel,提升微服务项目的稳定性和容错能力。

相关文章:

SpringCloud Alibaba 微服务(四):Sentinel

目录 前言 一、什么是Sentinel&#xff1f; Sentinel 的主要特性 Sentinel 的开源生态 二、Sentinel的核心功能 三、Sentinel 的主要优势与特性 1、丰富的流控规则 2、完善的熔断降级机制 3、实时监控和控制台 4、多数据源支持 5、扩展性强 四、Sentinel 与 Hystrix …...

Python 3.12新功能(1)

Python 3.12正式发布已经很久了&#xff0c;我才将主要电脑的Python版本从3.11升级到最新。最近刚好工作没有那么紧张了&#xff0c;就来领略下这个最新版本中的新特性。 改善了错误消息 Python作为一门编程语言&#xff0c;简单易学容易上手&#xff0c;童叟无欺&#xff0c;深…...

c++STL容器中vector的使用,模拟实现及迭代器使用注意事项和迭代器失效问题

目录 前言&#xff1a; 1.vector的介绍及使用 1.2 vector的使用 1.2 1 vector的定义 1.2 2 vector iterator&#xff08;迭代器&#xff09;的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5vector 迭代器失效问题。 2.vector模拟实现 2.1 std::vect…...

Android笔试面试题AI答之Activity常见考点

Activity的常见考点可以总结如下&#xff1a; 生命周期管理&#xff1a;理解Activity在不同情况下&#xff08;如屏幕旋转、配置更改、用户操作等&#xff09;的生命周期变化&#xff0c;包括但不限于onCreate、onStart、onResume、onPause、onStop和onDestroy等回调方法。 启…...

RK3568笔记四十九:W25Q64驱动开发(硬件SPI1)

若该文为原创文章&#xff0c;转载请注明原文出处。 一、SPI介绍 串行外设接口 (Serial Peripheral interface) 简称 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并 且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚。 …...

TypeScript 定义不同的类型(详细示例)

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…...

[工具推荐]前端加解密之Burp插件Galaxy

如果觉得该文章有帮助的&#xff0c;麻烦师傅们可以搜索下微信公众号&#xff1a;良月安全。点个关注&#xff0c;感谢师傅们的支持。 免责声明 本号所发布的所有内容&#xff0c;包括但不限于信息、工具、项目以及文章&#xff0c;均旨在提供学习与研究之用。所有工具安全性…...

课题项目结题测试的作用

课题项目结题测试是课题项目研究过程中的一个重要环节&#xff0c;它对于确保课题项目的质量和成果具有重要的作用。本文将详细介绍课题项目结题测试的作用。 一、确保课题项目质量 课题项目结题测试是对课题项目研究成果的全面评估和检测。通过结题测试&#xff0c;可以对课…...

中国工商银行长春分行开展“工驿幸福 健康财富”长辈客群康养活动

中国工商银行长春分行作为国有大行&#xff0c;持续完善有温度、专业化、安全稳健的养老场景服务&#xff0c;以工行驿站为依托、以长辈客群养老需求为中心&#xff0c;积极对接社区构建敬老、康养的“金融泛金融”工行驿站服务生态&#xff0c;进一步提升长辈客群的到店体验。…...

机器学习 第十四章

目录 前言 一、隐马尔可夫模型 二、马尔可夫随机场 三、条件随机场 四、学习和推断 1.变量消去 2.信念传播 五、近似推断 1.MCMC采样 2.变分推断 六、话题模型 总结 前言 机器学习最重要的任务是根据一些已观察到的证据来对感兴趣的未知变量进行估计和推测。概率模…...

未来RPA财税的发展前景

近年来&#xff0c;全球数字化进程持续提速&#xff0c;越来越多企业受到效率及运营成本的压力&#xff0c;正努力寻求企业增长发展的新路径&#xff0c;而财务作为企业战略的“大脑”&#xff0c;成为企业数字化转型的重要突破口。RPA技术由于能够自动化各种重复性和繁琐的任务…...

快速设置 terminator 透明背景

看图&#xff0c;按步骤设置后⭐重启一个终端则为透明效果 效果展示&#xff1a;...

Redis+Unity 数据库搭建

游戏中需要存放排行榜等数据&#xff0c;而且是实时存放&#xff0c;所以就涉及到数据库的问题。这里找服务器大神了解到可以用Redis来做存储&#xff0c;免费的效率极高。 Redis的搭建参考上文的文章&#xff0c;同时也感谢这位网友。 搭建Redis 并测试数据 搭建Redis 1.下…...

WebTracing:如何使用一款SDK实现前端全链路监控

引言 在产品的开发和运营过程中我们经常会遇到一些问题,如用户反馈说无法对某某商品下单,而另一位负责运营的同事也提到某某广告在手机上打不开。尽管这些问题被多次报告,但我们却难以复现这些故障,这让团队感到十分棘手。如何有效地记录项目中的错误并能够重现这些问题,…...

【Story】编程迷航:从 “ 我怎么才学会 ? ” 到 “ 我怎么这么厉害 ! ”

目录 大学生编程入门指南&#xff1a;选择语言、制定计划与避坑技巧1. 选择适合的编程语言1.1 Python1.2 Java1.3 C/C1.4 JavaScript1.5 SQL 2. 制定有效的学习计划2.1 设定明确的目标2.2 制定学习时间表2.3 选择学习资源2.4 实践和项目 3. 避免常见学习陷阱3.1 避免过度焦虑3.…...

基于“日志审计应用”的 DNS 日志洞察实践

作者&#xff1a;羿莉 (萧羿) 基础背景 DNS(Domain Name System) [ 1] 是任何网络活动的基础。它将易于记忆的域名转换为机器能够理解的 IP 地址。监控 DNS 服务可以帮助用户识别网络活动并保持系统安全。出于合规和安全性的考虑&#xff0c;公司通常要求对网络日志进行存储和…...

大学按照学科类别、办学层次、教育性质分类有哪些?创龙教仪一文带您了解

大学的分类多种多样&#xff0c;主要可以从学科类别、办学层次、教育性质等方面进行划分。 一、按学科类别划分 综合类大学 特点&#xff1a;学科门类齐全&#xff0c;文理渗透&#xff0c;科研实力强。 优势&#xff1a;拥有较多的国家级重点学科和实验室&#xff0c;师资…...

数据结构与算法 - 递归

一、递归 1. 概述 定义&#xff1a;在计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集。 比如单链表递归遍历的例子&#xff1a; void f(Node node) {if(node null) {return;}println("before:" node…...

python:plotly 网页交互式数据可视化工具

pip install plotly plotly-5.22.0-py3-none-any.whl pip install plotly_express 包含&#xff1a;GDP数据、餐厅的订单流水数据、鸢尾花 Iris数据集 等等 pip show plotly Name: plotly Version: 5.22.0 Summary: An open-source, interactive data visualization librar…...

聊一聊 webpack5性能优化有哪些?

介绍 此文章基于webpack5来阐述 webpack性能优化较多&#xff0c;可以对其进行分类 优化打包速度&#xff0c;开发或者构建时优化打包速度&#xff08;比如exclude、catch等&#xff09;优化打包后的结果&#xff0c;上线时的优化&#xff08;比如分包处理、减小包体积、CDN…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...