Spring Boot/Cloud集成Sentinel详解@SentinelResource埋点 | Spring Cloud 26
迪丽瓦拉
2025-05-30 14:58:44
0

一、前言

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

在前面我们通过以下章节对Sentinel有了基础的了解:

Sentinel:分布式系统的流量防卫兵 | Spring Cloud 19

Sentinel:资源与规则定义 | Spring Cloud 20

Sentinel:原理深入浅出解读 | Spring Cloud 21

Sentinel:流量控制规则定义详解 | Spring Cloud 22

Spring Boot/Cloud集成Sentinel实现流量控制 | Spring Cloud 23

Spring Boot/Cloud集成Sentinel实现流量控制 (二) | Spring Cloud 24

Spring Boot/Cloud集成Sentinel实现黑白名单(授权)控制及初始本地化规则 | Spring Cloud 25

现在开始我们正式学习SentinelSpring Boot/Cloud中的集成使用。

书接上回,在前面的章节中已经存在@SentinelResource注解的使用示例,在本章节主要进行对以下部分讲解说明:

  • @SentinelResource 注解各属性说明
  • 编写详尽示例加深 @SentinelResource 各属性理解

二、@SentinelResource 注解

Sentinel 支持通过 @SentinelResource 注解定义资源并配置 blockHandlerfallback 函数来进行限流之后的处理。

@SentinelResource注解方式埋点不支持 private 方法。

@SentinelResource 注解是 Sentinel 提供的最重要的注解之一,它还包含了多个属性,如下:

  • value:资源名称,必需项(不能为空)

  • entryTypeentry 类型,可选项(默认为 EntryType.OUT

  • blockHandler / blockHandlerClassblockHandler 对应处理 BlockException 的函数名称,可选项。

    • blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException

    • blockHandler 函数默认需要和原方法在同一个类中,若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • fallback / fallbackClassfallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。

    • fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:

      • 返回值类型必须与原函数返回值类型一致;
      • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
      • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
    • blockHandlerfallback 都进行了配置,因限流降级而抛出 BlockException只会进入 blockHandler 处理逻辑,其他则抛出异常进入fallback处理逻辑。

    • 若未配置 blockHandlerfallbackdefaultFallback,则被限流降级时会将 BlockException 直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException)。

  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。

    默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。

    • 若同时配置了 fallbackdefaultFallback,则只有 fallback 会生效。
    • defaultFallback 函数签名要求:
      • 返回值类型必须与原函数返回值类型一致;
      • 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
      • defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

  • exceptionsToTrace:与 exceptionsToIgnore含义相反,需计入异常统计的列表。

1.8.0 版本开始,defaultFallback 支持在类级别进行配置。

1.4.0 版本开始,注解方式定义资源支持自动统计业务异常,无需手动调用 Tracer.trace(ex) 来记录业务异常。Sentinel 1.4.0 以前的版本需要自行调用 Tracer.trace(ex) 来记录业务异常。

三、集成配置

3.1 Spring Cloud Alibaba

若您是通过 Spring Cloud Alibaba 接入的 Sentinel,则无需额外进行配置即可使用 @SentinelResource 注解。

3.2 Spring AOP

若您的应用使用了 Spring AOP,您需要通过配置的方式将 SentinelResourceAspect 注册为一个 Spring Bean

@Configuration
public class SentinelAspectConfiguration {@Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();}
}

需要引入以下依赖:

com.alibaba.cspsentinel-annotation-aspectjx.y.z

3.3 AspectJ

若您的应用直接使用了 AspectJ,那么您需要在 aop.xml 文件中引入对应的 Aspect



需要引入以下依赖:

com.alibaba.cspsentinel-annotation-aspectjx.y.z

四、使用示例

package com.gm.sentinel_nacos_consumer.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.atomic.AtomicInteger;@RestController
public class SentinelResourceDemoController {private static AtomicInteger pass = new AtomicInteger();/*** 配置blockHandler,配置流控规则,发生流控时进入blockHandler逻辑** @return*/@RequestMapping("/blockHandler")@SentinelResource(value = "blockHandler", blockHandler = "blockHandlerErr")public String blockHandler() {return "请求通过";}public String blockHandlerErr(BlockException be) {return "已被限流";}/*** 配置流控、熔断规则,发生流控或熔断时进入系统默认异常处理** @return*/@RequestMapping("/fallback")@SentinelResource(value = "fallback")public String fallback() {int i = pass.addAndGet(1);if (i % 2 == 0) {i = 1 / 0;}return "请求通过";}/*** 同时配置fallback、blockHandler,配置流控规则、熔断规则,发生流控时进入blockHandler,未发生流控而是熔断时进入fallback** @return*/@RequestMapping("/fallback2")@SentinelResource(value = "fallback2", fallback = "fallbackErr", blockHandler = "blockHandlerErr")public String fallback2() {int i = pass.addAndGet(1);if (i % 2 == 0) {i = 1 / 0;}return "请求通过";}public String fallbackErr(Throwable e) {e.printStackTrace();return "已被熔断";}/*** 同时配置fallback、defaultFallback,配置流控、熔断规则,发生熔断时进入fallback,限流时进入fallback** @return*/@RequestMapping("/fallback3")@SentinelResource(value = "fallback3", fallback = "fallbackErr", defaultFallback = "defaultFallbackErr")public String fallback3() {int i = pass.addAndGet(1);if (i % 2 == 0) {i = 1 / 0;}return "请求通过";}public String defaultFallbackErr(Throwable e) {return "默认异常处理";}/*** 配置exceptionsToIgnore,配置熔断规则,发生ArrayIndexOutOfBoundsException.class异常不计入熔断统计,* 也不会进入exceptionsToIgnoreFallbackErr,进入系统默认异常处理** @return*/@RequestMapping("/exceptionsToIgnore")@SentinelResource(value = "exceptionsToIgnore", exceptionsToIgnore = {ArrayIndexOutOfBoundsException.class},fallback = "exceptionsToIgnoreFallbackErr")public String exceptionsToIgnore() {int i = pass.addAndGet(1);if (i % 2 == 1) {int[] ints = {1, 2, 3};System.out.println(ints[10]);} else if (i % 3 == 1) {i = Integer.valueOf("s");}return "请求通过";}public String exceptionsToIgnoreFallbackErr(Throwable e) {return "已被熔断";}/*** 配置exceptionsToTrace,配置熔断规则,只有发生ArrayIndexOutOfBoundsException.class异常计入熔断统计,* 并进入exceptionsToIgnoreFallbackErr,其他异常进入系统默认处理** @return*/@RequestMapping("/exceptionsToTrace")@SentinelResource(value = "exceptionsToTrace", exceptionsToTrace = {ArrayIndexOutOfBoundsException.class},fallback = "exceptionsToTraceFallbackErr")public String exceptionsToTrace() {int i = pass.addAndGet(1);if (i % 2 == 1) {int[] ints = {1, 2, 3};System.out.println(ints[10]);} else if (i % 3 == 1) {i = Integer.valueOf("s");}return "";}public String exceptionsToTraceFallbackErr(Throwable e) {return "已被熔断";}}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...