Spring Cloud Alibaba学习 3- Sentinel入门使用

news2025/2/27 23:14:29

Spring Cloud Alibaba学习 3- Sentinel入门使用

中文文档参考:Sentinel中文文档

一. SpringCloud整合Sentinel

1.1 下载Sentinel-Dashboard

Sentinel下载地址:Sentinel-Dashboard

到下载目录,cmd输入

java -jar sentinel-dashboard-1.8.8.jar

如果8080端口被占用,可以指定其他端口

java -jar sentinel-dashboard-1.8.6.jar --server.port=8082

如果不指定账号和密码,则都是sentinel

初次访问的时候发现什么都没有,只有在首次在程序中调用Sentinel资源时,F5刷新后才会有东西

在这里插入图片描述

1.2 引入Sentinel相关依赖

在公共模块中引入Sentinel相关依赖

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

1.3 配置Sentinel客户端

spring:
  cloud:
    # sentinel
    sentinel:
      transport:
        dashboard: localhost:8080 # dashboard地址
        port: 8080 # Sentinel地址
    # nacos
    nacos:
      server-addr: 127.0.0.1:8848 # Nacos客户端
      discovery:
        cluster-name: order #集群名
        namespace: public #命名空间
        service: order #服务名
        metadata: #服务元数据,会给每个实例都配置对应的元数据
          name: orderService
      config:
        server-addr: 127.0.0.1:8848 # Nacos作为配置中心地址
        namespace: dev
        group: orderservice
        file-extension: yml # 指定 yml 格式的配置
        import-check:
          enabled: false # 禁用导入检查
        refresh-enabled: true	
  # 用 application.yml作为Nacos配置中心的配置文件需要配置如下
  config:
    import:
      - optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
server:
  port: 8081

1.4 配置Sentinel资源

用@SentinelResource配置到Controller的接口方法上,不配置也可以,Sentinel会自动监听所有的Controller的接口方法

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    public DiscoveryClient client;
    @Autowired
    private GoodClient goodClient;
    @SentinelResource
    @GetMapping("output")
    public void output(ServletResponse response) {
        HttpServletResponse res = (HttpServletResponse) response;
        try {
            res.getWriter().write("ABCDEFG");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

请求

http://localhost:8081/order/output

查看Sentinel控制台,已经有了应用,整合成功

在这里插入图片描述

二. Sentinel使用配置

参考前辈最后一支迷迭香的文章SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)-CSDN博客

1. 流控规则

1.1 参数介绍

在这里插入图片描述

  • 资源名

​ 接口访问的URL

  • 针对来源

​ 服务的调用者,默认为defalut所有来源

  • 阈值类型

QPS:接口每秒的访问量

并发线程数:调用的线程数

  • 单机阈值

​ 阈值类型对应的值

  • 流控模式

直接:只要达到了流控标准,就会限流当前资源

关联:当关联的资源达到了流控标准,就会限流当前资源

链路:当从入口资源去调用某个@SentinelResource指定的资源达到了流控标准,就会限流当前入口资源对该资源的调用

  • 流控效果

快速失败:直接抛出错误

Warm Up:根据预热因子和指定的预热时间,慢慢增加接收的流量直到达到阈值

排队等待:匀速排队接收流量

1.2 流控规则演示
1.2.1 直接流控演示

正常访问接口http://localhost:8081/order/output时,会在浏览器输出ABCDEFG

在这里插入图片描述

配置了下图规则

在这里插入图片描述

快速F5刷新页面,会触发流控

在这里插入图片描述

1.2.2 关联流控演示

在当前接口创建了测试关联流控的接口

@GetMapping("/testRelated")
public String testRelated() {
    return "hello";
}

配置了下图规则

在这里插入图片描述

快速请求关联资源,当前接口被流控
在这里插入图片描述

在这里插入图片描述

1.2.3 链路流控演示

在配置文件中关闭sentinel对同一个Controller里所有方法的整合,这样不会把所有方法放在一个链路里(链路流控无效)

sentinel:
  transport:
    dashboard: localhost:8080 # dashboard地址
    port: 8080 # Sentinel地址
  # 关闭整合
  web-context-unify: false

可以看到,现在每个方法都是一个链路

在这里插入图片描述

OrderController接口方法如下,重点记住要给被链路流控的资源加上@SentinelResource(“xxx”),这样该接口才会作为入口资源下的链路!!

@RestController
@RequestMapping("/order")
@Slf4j
@RefreshScope
public class OrderController {
	@SentinelResource("resource")
	@GetMapping("/testRelated")
    public String testRelated() {
        return "hello";
    }
    
    @GetMapping("/testFeign")
    public void testFeign() {
        testRelated();
    }
}

可以看到,控制台已经将 resource 资源置于 /order/testFeign链路下了

在这里插入图片描述

接着在Sentinel控制台配置了下图规则

在这里插入图片描述

直接访问localhost:8081/order/testRelated,快速刷新,依然可以看到正常返回

在这里插入图片描述

访问localhost:8081/order/testFeign,快速刷新,报错,这是由于从/order/testFeign链路下的resource被流控了抛出的错误

在这里插入图片描述

2. 熔断规则

2.1 参数介绍

在这里插入图片描述

  • 熔断器状态

熔断器类似一个开关,有 全开半开关闭 三个状态

全开(OPEN):正常接收请求

半开(HALF_OPEN):熔断器在指定的熔断时长后,进入半开状态,此时会发送一个探测请求,如果此次请求成功,则进入关闭状态,否则退回全开状态,等待下一个熔断时长结束再进行探测。

关闭(CLOSED):当处于关闭状态时,请求均可以通过。

  • 熔断策略

​ 熔断器都是根据一段统计时间的请求的状况来进行状态切换的。

1. 慢调用比例
最大RT:RT 表示 Reponse time,即最大响应时间,当超过了设置的时间就会算作一个请求无效
比例阈值:当超过设定的比例阈值(百分之几)的请求都是慢调用的时候,就会触发熔断

2. 异常比例

比例阈值:当超过设定的比例阈值(百分之几)的请求都出现异常的时候,就会触发熔断

3. 异常数

异常数:当异常请求数超过了设定的异常数时,就会触发熔断

  • 熔断时长

​ 顾名思义,熔断器在触发熔断策略后,进入熔断状态(关闭状态)的时长

  • 最小请求数

​ 只有请求超过了最小请求数之后,才会开始进入统计时长

  • 统计时长

​ 熔断策略中的指标都是在指定的一段统计时长进行统计

2.2 熔断演示

这里只拿慢调用比例来演示,其他的也都差不多,要演示熔断,需要用到压测工具,apipostjmeter都是好用的压测工具,这里就直接用 apipost 进行简单压测

配置了下图的熔断规则

在这里插入图片描述

让请求休眠一段时间,接口方法如下:

@RestController
@RequestMapping("/order")
public class OrderController {
@GetMapping("/testRelated")
    public String testRelated() {
        try {
            TimeUnit.SECONDS.sleep(1);    
        } 
        catch (Exception e) {
        }
        return "hello";
    }
}

对接口http://localhost:8081/order/testRelated进行压测

在这里插入图片描述

浏览器访问时,已经熔断了

在这里插入图片描述

3. 热点规则

3.1 参数介绍

在这里插入图片描述

  • 参数索引

​ 对应的接口方法的传入的参数索引,Sentinel会对配置的相同参数的请求会进行流控

  • 参数例外项

​ 配置需要特殊管理的参数值

3.2 热点演示

通过热点规则,可以限制接口方法参数,实现一些热点数据的管理,比如秒杀活动时一个用户在30s内只能对该商品下一次单,但是VIP用户可以多次下单

接口 OrderController

@RestController
@RequestMapping("/order")
public class OrderController {
    @SentinelResource("testHotPointInfo")
    public String testHotPointInfo(int userID) {
            return "下单成功";
    }
}

userID为2的是VIP用户,无需流控,其他用户只能在30s内下一次单,如下图所配置

在这里插入图片描述

非VIP用户多次下单

在这里插入图片描述

VIP用户多次下单

在这里插入图片描述

4. @SentinelResource

通过@SentinelResource注解,可以帮助我们快速处理异常

4.1 常用参数说明
  • **value:**定义资源名
  • blockHandlerClass:指定资源如果被Sentinel限流了,抛出的自定义兜底方法所在的类
  • blockHandler:指定资源如果被Sentinel限流了,抛出的自定义兜底方法该自定义方法要求是静态的,该方法的返回参数与原方法的返回参数相同,方法参数需要有BlockException
  • fallbackClass:指定资源如果出现了错误,抛出的自定义兜底方法
  • fallback:指定资源如果出现了错误了,抛出的自定义兜底方法该自定义方法要求是静态的,该方法的返回参数与原方法的返回参数相同
4.2 测试异常处理兜底返回

定义异常处理类 OrderBlockHandler,关键是方法要静态

public class OrderBlockHandler {
	//限流兜底抛出
    public static String blockFallback(BlockException ex) {
        return "我被限流了,直接失败";
    }
    //异常兜底抛出
    public static String ExceptionFallback() {
    	return "我出错了,直接失败"
    }
}

定义接口类 OrderController

@RestController
@RequestMapping("/order")
public class OrderController {
    @GetMapping("/testHotPointInfo")
    @SentinelResource(value = "testHotPointInfo", blockHandlerClass = OrderBlockHandler.class, blockHandler = "blockFallback")
    public String testHotPointInfo() {
        return "123";
    }
}

结合上面提到的流控(这里就不再记录配置了),访问http://localhost:8081/order/testHotPointInfo

在这里插入图片描述

在接口里加上

int i = 1 / 0;

访问报错

在这里插入图片描述

5. Sentinel异常处理机制

尚硅谷新版SpringCloud上有一张很好的图,有空再补充

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

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

相关文章

使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍一下deepseek等LLM在分数流量数据包这方面的能力。为需要借助LLM等大模型辅助分析流量数据包的同学提供参考&#xff0c;也了解一下目前是否有必要继续学习wireshark工具以及复杂的协议知识。 pcap格式 目…

C语言 --- 经典习题1

C语言 --- 经典习题1 第 一 题 - - - 交 换 两 个 整 数 的 值&#xff08;四 种 方 法&#xff09;第 二 题 - - - 最 大 公 约 数 和 最 小 公 倍 数 之 和总结 &#x1f4bb;作者简介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &#x1…

自定义mybatis拦截器,在springboot项目中不起作用的解决方法

自定义mybatis拦截器&#xff0c;在springboot项目中不起作用的解决方法 自定义mybatis拦截器&#xff0c;在若依springboot项目中不起作用的原因 找到 MyBatisConfig 配置类&#xff0c;引入自定义配置 在sqlSessionFactory中添加自定义拦截器&#xff0c;就可以正常使用了…

记录一下在k3s快速创建gitlab

废话不多说&#xff0c;直接上配置文件 需要修改的地方&#xff08;备注都有写&#xff09;&#xff1a; 1.命名空间 namespace 2. claimName 文件挂载 Deployment kind: Deployment apiVersion: apps/v1 metadata:name: gitlabnamespace: cicd # 替换为您的命名空间la…

AWQ和GPTQ量化的区别

一、前言 本地化部署deepseek时发现&#xff0c;如果是量化版的deepseek&#xff0c;会节约很多的内容&#xff0c;然后一般有两种量化技术&#xff0c;那么这两种量化技术有什么区别呢&#xff1f; 二、量化技术对比 在模型量化领域&#xff0c;AWQ 和 GPTQ 是两种不同的量…

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…

湖北中医药大学谱度众合(武汉)生命科技有限公司研究生工作站揭牌

2025年2月11日&#xff0c;湖北中医药大学&谱度众合&#xff08;武汉&#xff09;生命科技有限公司研究生工作站揭牌仪式在武汉生物技术研究院一楼101会议室举行&#xff0c;湖北中医药大学研究生院院长刘娅教授、基础医学院院长孔明望教授、基础医学院赵敏教授、基础医学院…

面试基础---深入解析 AQS

深入解析 AQS&#xff1a;从源码到实践&#xff0c;剖析 ReentrantLock 和 Semaphore 的实现 引言 在 Java 并发编程中&#xff0c;AbstractQueuedSynchronizer&#xff08;AQS&#xff09;是一个核心框架&#xff0c;它为构建锁和其他同步器提供了基础支持。ReentrantLock 和…

从 0 到 1,用 Python 构建超实用 Web 实时聊天应用

从 0 到 1&#xff0c;用 Python 构建超实用 Web 实时聊天应用 本文深入剖析如何运用 Python 的 Flask 框架与 SocketIO 扩展&#xff0c;搭建一个功能完备的 Web 实时聊天应用。从环境搭建、前后端代码实现&#xff0c;到最终运行展示&#xff0c;逐步拆解关键步骤&#xff0…

Vue2+Element实现Excel文件上传下载预览【超详细图解】

目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一&#xff1a;代码 方式二&#xff1a;代码 3.文件预览 图片示例 方式一&#xff1a;代码 方式二&#xff1a;代码 一、需求背景 在一个愉快的年后&#xff…

[记录贴] 火绒奇怪的进程保护

最近一次更新火绒6.0到最新版&#xff0c;发现processhacker的结束进程功能无法杀掉火绒的进程&#xff0c;弹窗提示如下&#xff1a; 可能是打开进程时做了权限过滤&#xff0c;火绒注册了两个回调函数如下&#xff1a; 但奇怪的是&#xff0c;在另外一台机器上面更新到最新版…

【蓝桥杯】每天一题,理解逻辑(1/90)【Leetcode 移动零】

文章目录 题目解析讲解算法原理【双指针算法思路】(数组下标充当指针)如何划分和执行过程大致 代码详情 题目解析 题目链接&#xff1a;https://leetcode.cn/problems/move-zeroes/description/ 题目意思解析 把所有的零移动到数组的末尾保持非零元素的相对顺序 理解了这两层…

pycharm远程连接服务器运行pytorch

Linux部署pytorch 背景介绍 不同的开源代码可能需要不同的实验环境和版本&#xff0c;这时候的确体现出Anaconda管理环境的好处了&#xff0c;分别搞一个独立环境方便管理。 有的教程建议选择较旧的版本&#xff0c;但笔者建议在条件允许的情况下安装最新版&#xff0c;本次…

java练习(41)

ps&#xff1a;题目来自力扣 最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 import java.util.Arrays;class Solut…

PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍

2025-02-22 20:10物联全栈123 尊敬的诸位&#xff01;我是一名物联网工程师。关注我&#xff0c;持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中&#xff0c;扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…

轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置

一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时&#xff0c;合理的环境管理是必不可少的&#xff0c;特别是当你在多个项目中…

驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线

一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…

MinIO整合SpringBoot实现文件上传、下载

文章目录 配置1. 部署MinIO服务2. 整合SpringBoot 功能实现1. 文件上传2. 文件下载 总结 配置 1. 部署MinIO服务 这里以docker为例&#xff1a; 安装minio命令docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -v /path/to/data:/data \ -e "MINIO_ROOT_USERmin…

FreeRTOS(3)列表List

在 FreeRTOS 的源码中大量地使用了列表和列表项&#xff0c;因此想要深入学习 FreeRTOS&#xff0c;列表和列表项是必备的基础知识。这里所说的列表和列表项&#xff0c;是 FreeRTOS 源码中 List 和 List Item 的 直译&#xff0c;事实上&#xff0c; FreeRTOS 中的列表和列表项…

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…