Sentinel 笔记

Sentinel 笔记

1 介绍

Sentinel 是阿里开源的分布式系统流量防卫组件,专注于 流量控制、熔断降级、系统保护

官网:https://sentinelguard.io/zh-cn/index.html

wiki:https://github.com/alibaba/Sentinel/wiki

对比同类产品

产品特点
HystrixNetflix 开源,功能全面但已停止维护,基于线程池隔离,资源消耗较大
Resilience4j轻量级,基于函数式编程,但需要结合其他组件实现完整功能
Sentinel轻量级,实时监控和控制,支持动态规则配置,与 Spring Cloud 深度集成

2 架构

在这里插入图片描述

  • 核心模块
    • 资源:被保护的代码逻辑(如接口、方法)。
    • 规则:流量控制、熔断降级等策略。
    • 控制台:可视化规则配置与实时监控。

4 环境搭建

4.1 依赖

<!-- Spring Cloud Alibaba Sentinel -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

4.2 启动控制台

  1. 下载 Sentinel Dashboard 官方 Release或📎sentinel-dashboard-1.8.8.jar

  2. 启动命令:

    下载完成后:在文件目录输入cmd进入bash命令行

    在命令行窗口输入:即可启动项目

 java -jar sentinel-dashboard-1.8.8.jar

3.通过http://localhost:8080即可访问sentinel的控制台

在这里插入图片描述

正常访问后显示的界面:
在这里插入图片描述

4.3 配置连接

application.yml 中配置:

# 订单以及商品都要配置
spring:cloud:sentinel:transport:dashboard: localhost:8080 # 控制台地址eager: true # 立即初始化

配置成功后:

在这里插入图片描述

假设我们要把createOrder注册为我们要管理的服务。

    @SentinelResource(value = "createOrder")public Order createOrder(Long userId, Long productId) {//Product product = productFeignClient.getProductById(productId);//使用RestTemplate实现负载均衡//Product product = getProductFromRemqteWithLoadBalanceAnnotation(productId);//使用feignClient实现远程调用Product product = productFeignClient.getProductById(productId);Order order = new Order();order.setId(1L);order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));//order.setTotalAmount(BigDecimal.valueOf(0));order.setUserId(userId);order.setNickName("zhangsan");order.setAddress("尚硅谷");order.setProductList(Arrays.asList(product));return order;}

创建订单的请求:http://localhost:8000/order/create?userId=1&productId=100

在这里插入图片描述

接下来就可以对资源进行流控。

QPS:每秒能接收的请求数

5 异常处理

image.png

5.1 自定义 BlockExceptionHandler

目的:处理业务异常,出现异常可以给前端传递一些消息。

实现 BlockExceptionHandler 接口,处理流控/熔断异常:

// order模块下
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {private ObjectMapper objectMapper = new ObjectMapper();@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,String resourceName, BlockException e) throws Exception {response.setStatus(429); //too many requestsresponse.setContentType("application/json;charset=utf-8");PrintWriter writer = response.getWriter();R error = R.error(500, resourceName + " 被Sentinel限制了,原因:" + e.getClass());String json = objectMapper.writeValueAsString(error);writer.write(json);writer.flush();writer.close();}
}

5.2 blockHandler

使用 @SentinelResource 注解指定降级方法:

 @SentinelResource(value = "createOrder",blockHandler = "createOrderFallback")@Overridepublic Order createOrder(Long productId, Long userId) {
//        Product product = getProductFromRemoteWithLoadBalanceAnnotation(productId);//使用Feign完成远程调用Product product = productFeignClient.getProductById(productId);Order order = new Order();order.setId(1L);// 总金额order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));order.setUserId(userId);order.setNickName("zhangsan");order.setAddress("尚硅谷");//远程查询商品列表order.setProductList(Arrays.asList(product));return order;}//出现异常,兜底回调public Order createOrderFallback(Long productId, Long userId, BlockException e){Order order = new Order();order.setId(0L);order.setTotalAmount(new BigDecimal("0"));order.setUserId(userId);order.setNickName("未知用户");order.setAddress("异常信息:"+e.getClass());return order;}
//没自定义异常,就会自动向上抛,最后给Spring的全局拦截器捕获到,由spring去处理异常

5.3 OpenFeign-兜底回调

  1. 实现 Fallback 类:
@FeignClient(value = "service-product",fallback = ProductFeignClientFallback.class) // feign客户端
public interface ProductFeignClient {//mvc注解的两套使用逻辑//1、标注在Controller上,是接受这样的请求//2、标注在FeignClient上,是发送这样的请求@GetMapping("/product/{id}")Product getProductById(@PathVariable("id") Long id);}

2.在 Feign 接口中指定:

@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserService { /* ... */ }

6 规则 - 流量控制

image.png

6.1 阈值类型

  • QPS:每秒请求数。
  • 线程数:并发线程数。

6.2 流控模式

img

  • 直接:针对当前资源。
  • 关联:关联资源触发阈值时限流。
  • 链路:基于调用链路限流。

6.3 流控效果

image.png

  • 快速失败:直接拒绝请求。
  • Warm Up:预热模式,逐步增加阈值。
  • 排队等待:请求进入队列等待处理。

7 规则 - 熔断降级

7.1 断路器状态

image.png

  • Closed:正常状态。
  • Open:熔断状态,拒绝所有请求。
  • Half-Open:尝试放行部分请求探测恢复情况。

7.2 工作原理

image.png

  • 慢调用比例:响应时间超过阈值且比例超限。
  • 异常比例:异常比例超限。
  • 异常数:异常数超限。

7.3 熔断与兜底

image.png


8 规则 - 热点参数

image.png

8.1 环境搭建

  1. 添加热点参数限流规则:
 @GetMapping("/seckill")@SentinelResource(value = "seckill-order",fallback = "seckillFallback")public Order seckill(@RequestParam(value = "userId",required = false) Long userId,@RequestParam(value = "productId",defaultValue = "1000") Long productId){Order order = orderService.createOrder(productId, userId);order.setId(Long.MAX_VALUE);return order;}public Order seckillFallback(Long userId,Long productId, BlockException exception){System.out.println("seckillFallback....");Order order = new Order();order.setId(productId);order.setUserId(userId);order.setAddress("异常信息:"+exception.getClass());return order;}

重点总结

  1. 核心功能
    • 流量控制(QPS/线程数)、熔断降级(慢调用/异常比例)、热点参数限流。
  2. 优势
    • 动态规则配置,实时监控,与 Spring Cloud 无缝集成。
  3. 实操关键
    • 控制台启动后需配置 spring.cloud.sentinel.transport.dashboard
    • 使用 @SentinelResource 定义资源和降级逻辑。
    • OpenFeign 需结合 Fallback 类实现服务降级。
  4. 注意事项
    • 规则配置后需持久化到 Nacos/Redis,避免重启丢失。
    • 生产环境建议开启 Sentinel 的集群流控功能。

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

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

相关文章

manus本地部署方法研究测试

Manus本地部署方法&#xff0c;Manus邀请码实在太难搞了&#xff0c;昨晚看到有一个团队&#xff0c;5个人3个小时&#xff0c;一个完全免费、无需排队等待的OpenManus就做好了。 由于也是新手&#xff0c;找了好几轮&#xff0c;实在是没有找到合适的部署方法&#xff0c;自己…

FreeRTOS第15篇:FreeRTOS链表实现细节03_List_t与ListItem_t的奥秘

文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 FreeRTOS列表的核心数据结构 FreeRTOS的列表实现由两个关键结构体组成:List_t(列表)和ListItem_t(列表项)。它们共同…

gzip压缩

什么是Gzip 前端优化&#xff1a;开启Gzip压缩_前端开启gzip压缩-CSDN博客 Gzip是一种文件压缩算法&#xff0c;减少文件大小&#xff0c;节省带宽从而提减少网络传输时间&#xff0c;网站会更快地加载。 如何判断是否开启&#xff1a; 请求头&#xff1a;服务端会通过客户…

机器学习在地图制图学中的应用

原文链接&#xff1a;https://www.tandfonline.com/doi/full/10.1080/15230406.2023.2295948#abstract CSDN/2025/Machine learning in cartography.pdf at main keykeywu2048/CSDN GitHub 核心内容 本文是《制图学与地理信息科学》特刊的扩展评论&#xff0c;系统探讨了机…

智慧消防新篇章:4G液位/压力传感器,筑牢安全防线!

火灾无情&#xff0c;防患未“燃”&#xff01;在智慧消防时代&#xff0c;如何实现消防水系统的实时监测、预警&#xff0c;保障人民生命财产安全&#xff1f;山东一二三物联网深耕物联网领域&#xff0c;自主研发4G液位、4G压力智能传感器&#xff0c;为智慧消防水位、水压无…

set、LinkedHashSet和TreeSet的区别、Map接口常见方法、Collections 工具类使用

DAY7.2 Java核心基础 想学习Collection、list、ArrayList、Set、HashSet部分的小伙伴可以转到 7.1集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判断两个对象是否相等文章查看 set集合 在set集合中&#xff0c;处理LinkedHashSet是有序的&#xf…

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目录 1. git update-git-for-windows 报错2. 解决方案2.1. 更新 CA 证书库2.2. 使用 SSH 连接&#xff08;推荐&#xff09;2.3 禁用 SSL 验证&#xff08;不推荐&#xff09; 1. git update-git-for-windows 报错 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…

《深度剖析架构蒸馏与逻辑蒸馏:探寻知识迁移的差异化路径》

在人工智能模型优化的前沿领域&#xff0c;架构蒸馏与逻辑蒸馏作为知识蒸馏的关键分支&#xff0c;正引领着模型小型化与高效化的变革浪潮。随着深度学习模型规模与复杂度的不断攀升&#xff0c;如何在资源受限的情况下&#xff0c;实现模型性能的最大化&#xff0c;成为了学术…

先序二叉树的线索化,并找指定结点的先序后继

#include<stdio.h> #include<stdlib.h> #define elemType char //线索二叉树结点 typedef struct ThreadNode{ elemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;//用来判断一个结点是否有线索 }ThreadNode,*ThreadTree; //全局变量…

蚂蚁集团转正实习大模型算法岗内推

1.负责以大模型为代表的A转术能力的建设和优化&#xff0c;打造业界领先的A(技术系统&#xff0c;主要职责包括A系统结构设计、RAG 系统开发、大模型凯练数据构建、大模型能力评测、大模型准理效果和效率优化等 2.紧密跟踪、探索大模型方向前沿技术&#xff0c;依托丰富目体系化…

未授权漏洞大赏

ActiveMQ未授权访问漏洞 漏洞描述 Apache ActiveMQ是美国阿帕奇&#xff08;Apache&#xff09;软件基金会所研发的一套开源的消息中间件&#xff0c;它支持Java消息服务、集群、Spring Framework等。 Apache ActiveMQ管理控制台的默认管理用户名和密码分别为admin和admin&am…

Python包结构与 `__init__.py` 详解

1. 什么是 __init__.py&#xff1f; __init__.py 是Python包的标识文件&#xff0c;它告诉Python解释器这个目录应该被视为一个包&#xff08;Package&#xff09;。这个文件可以为空&#xff0c;也可以包含初始化代码。 1.1 基本作用 包的标识 将普通目录转换为Python包允许…

Web前端开发——HTML基础下

HTML语法 一表格1.基本格式2.美化表格合并居中属性 二表单1.input2.select3.textarea4.button5.date6.color7.checkbox8.radio9.range10.number 一表格 1.基本格式 HTML表格由<table>标签定义 其中行由<tr>标签定义&#xff0c;单元格由<td>定义。我们先来…

小程序事件系统 —— 33 事件传参 - data-*自定义数据

事件传参&#xff1a;在触发事件时&#xff0c;将一些数据作为参数传递给事件处理函数的过程&#xff0c;就是事件传参&#xff1b; 在微信小程序中&#xff0c;我们经常会在组件上添加一些自定义数据&#xff0c;然后在事件处理函数中获取这些自定义数据&#xff0c;从而完成…

安卓设备root检测与隐藏手段

安卓设备root检测与隐藏手段 引言 安卓设备的root权限为用户提供了深度的系统控制能力&#xff0c;但也可能带来安全风险。因此&#xff0c;许多应用&#xff08;如银行软件、游戏和流媒体平台&#xff09;会主动检测设备是否被root&#xff0c;并限制其功能。这种对抗催生了ro…

如何在Ubuntu上直接编译Apache Doris

以下是在 Ubuntu 22.04 上直接编译 Apache Doris 的完整流程&#xff0c;综合多个版本和环境的最佳实践&#xff1a; 注意&#xff1a;Ubuntu的数据盘VMware默认是20G&#xff0c;编译不够用&#xff0c;给到50G以上吧 一、环境准备 1. 安装系统依赖 # 基础构建工具链 apt i…

vuejs相关链接和格式化插件推荐

vue官网&#xff1a; https://cn.vuejs.org/ 配合路由设置&#xff1a; https://router.vuejs.org/zh/guide/ element plus (vue3) | element UI (vue2)&#xff1a; https://element-plus.org/zh-CN/#/zh-CN 构建工具vite&#xff1a; https://cn.vitejs.dev/ 右键选择…

IDEA中Git版本回退终极指南:Reset与Revert双方案详解

目录 前言一、版本回退前置知识二、Reset方案&#xff1a;整体改写历史1、IDEA图形化操作&#xff08;推荐&#xff09;1.1、查看提交历史1.2、选择目标版本1.3、选择回退模式1.3.1、Soft&#xff08;推荐&#xff09;1.3.2、Mixed1.3.3、Hard&#xff08;慎用&#xff09;1.3.…

PHP并发请求优化:使用`curl_multi_select()`实现高效的多请求处理

PHP并发请求优化&#xff1a;使用curl_multi_select()实现高效的多请求处理 背景 最近在项目中遇到一个需求&#xff0c;需要从多个 1 级网站&#xff08;超过 200 个&#xff09;获取数据&#xff0c;并且是通过 POST 请求瞬间发送到这些网站上。开始时我直接使用了 curl_ex…

【leetcode hot 100 206】反转链表

解法一&#xff1a;&#xff08;头插法&#xff09;在遍历链表时&#xff0c;将当前节点的 next 指针改为指向前一个节点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val)…