Sentinel(十八)之注解支持

转载自  注解支持

Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException等。使用 Sentinel Annotation AspectJ Extension 的时候需要引入以下依赖:

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>x.y.z</version>
</dependency>

@SentinelResource 注解

注意:注解方式埋点不支持 private 方法。

@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource 注解包含以下属性:

  • value:资源名称,必需项(不能为空)
  • entryType:entry 类型,可选项(默认为 EntryType.OUT
  • blockHandler / blockHandlerClassblockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • fallback / fallbackClass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    • defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

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

注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理

特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandlerfallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException)。

示例:

public class TestService {// 原函数@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")public String hello(long s) {return String.format("Hello at %d", s);}// Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.public String helloFallback(long s) {return String.format("Halooooo %d", s);}// Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.public String exceptionHandler(long s, BlockException ex) {// Do some log here.ex.printStackTrace();return "Oops, error occurred at " + s;}// 这里单独演示 blockHandlerClass 的配置.// 对应的 `handleException` 函数需要位于 `ExceptionUtil` 类中,并且必须为 public static 函数.@SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})public void test() {System.out.println("Test");}
}

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

配置

Spring Cloud Alibaba

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

Spring AOP

若您的应用使用了 Spring AOP(无论是 Spring Boot 还是传统 Spring 应用),您需要通过配置的方式将 SentinelResourceAspect 注册为一个 Spring Bean:

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

我们提供了 Spring AOP 的示例,可以参见 sentinel-demo-annotation-spring-aop。

AspectJ

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

<aspects><aspect name="com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect"/>
</aspects>

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

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

相关文章

jzoj3338-[NOI2013模拟]法法塔的奖励【权值线段树,线段树合并】

正题 题目大意 一棵树&#xff0c;对于每个点&#xff0c;求从任何一个在该点的子树为头&#xff0c;以该点为结尾的序列必须选择这个点的最长不降子序列。 解题思路 首先我们使用权值线段树计算答案每个点(l,r,w)(l,r,w)(l,r,w)表示以l∼rl\sim rl∼r为结尾最长的不降升子序…

设计模式之策略模式在地铁票价系统中的应用

引言设计模式是面向对象编程的一个非常精彩的部分。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性&#xff0c;它能帮助我们将应用组织成容易了解&#xff0c;容易维护&#xff0c;具有弹性的架构。本文通过一个简单的案例来讲述策略模式在地铁票价系…

jzoj3339-[NOI2013模拟]wyl8899和法法塔的游戏【博弈论,暴力】

正题 题目大意 有nnn堆石子&#xff0c;每次选择一个区间博弈&#xff0c;先手必须先取最右边的石子堆。 每次询问(r,a,b)(r,a,b)(r,a,b)表示在a∼ba\sim ba∼b中选择一个数lll。要求使用l∼rl\sim rl∼r这个区间的石子进行博弈&#xff0c;然后若先手必胜输出最右边的石子需…

Sentinel(十九)之主流框架的适配

转载自 主流框架的适配 注&#xff1a;适配模块仅提供相应适配功能&#xff0c;若希望接入 Sentinel 控制台&#xff0c;请务必参考 Sentinel 控制台文档。 云原生微服务体系 Spring Cloud Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。Sentinel 与 Spring …

利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

【先上一张效果图】&#xff1a;一、原理&#xff1a;其实原理很简单&#xff1a;1.手机投屏到电脑&#xff1b;2.截取投屏画面的题目部分&#xff0c;进行识别&#xff0c;得到题目和三个答案&#xff1b;3.将答案按照一定的算法&#xff0c;进行搜索&#xff0c;得出推荐答案…

Sentinel(二十)之Envoy RLS Token Server

转载自 Envoy RLS Token Server Sentinel 提供了一个 Envoy Global Rate Limiting gRPC Service 的实现 sentinel-cluster-server-envoy-rls&#xff0c;借助集群限流 token server 来为 Envoy 服务网格提供集群流量控制的能力。 Note: You can refer to here for the Englis…

欢乐纪中某A组赛【2019.7.9】

前言 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 心态大崩 ZYCdalaoZYCdalaoZYCdalao去AKBAK\ BAK B组了所以应该是我垫…

g4e基础篇#5 创建分支和保存代码

使用版本控制系统最常见的工作流程就是修改代码&#xff0c;保存代码&#xff0c;共享代码。Git提供了一个简单的3步工作流&#xff0c;让你方便的完成这些操作。1. 新建工作分支2. 提交更改3. 推送分支到中心存储库与团队成员共享Git 工作流按照以上3步操作&#xff0c;我们就…

P3952-时间复杂度【模拟】

正题 题目链接:https://www.luogu.org/problemnew/show/P3952 题目大意 比较复杂就直接给截图了 解题思路 开一个栈来维护序列&#xff0c;因为它保证合法的程序中一个变量不会相互嵌套所以就拿变量的字母当做每个循环的下标即可。然后对于输入的x,yx,yx,y有五种情况 xN,yN…

Sentinel(二十一)之Sentinel Dashboard控制台日志路径设置

一、sentinel-dashboard配置文件 配置文件内容&#xff1a;Sentinel/sentinel-dashboard/src/main/resources/application.properties #spring settings spring.http.encoding.forcetrue spring.http.encoding.charsetUTF-8 spring.http.encoding.enabledtrue#cookie name se…

一步步部署基于Windows系统的Jenkins持续集成环境

如题&#xff1a;本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境。之所以写本文&#xff0c;是因为在最近工作当中&#xff0c;学习使用Jenkins时&#xff0c;确实遇到了一些问题&#xff0c;而大多数教程文档都是基于Mac或是Linux平台。为此很是头疼&#xff0c;经…

Sentinel(二十二)之使用Nacos存储规则

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel使用Nacos存储规则 通过上一篇《使用Sentinel实现接口限流》的介绍&#xff0c;相信大家对Sentinel已经有了初步的认识。在Spring Cloud Alibaba的整合封装之下&#xff0c;接口限流这件事情可以非常轻易的整合到我们…

jzoj3347,bzoj3257-[NOI2013模拟]树的难题【树形dp】

正题 BZOJBZOJBZOJ题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id3257 题目大意 一棵树上的节点有333种颜色&#xff0c;有边权。 选择一些边割掉使得森林中每棵树只有一个白点或没有黑点。 求割掉的边的最小值。 解题思路 定义fi,statef_{i,state}fi,state​…

vue 开发2017年变化回顾及2018年展望

vue.js 变化从 github 的发布记录我们可以看到2017年 vue.js 的第一个发布为 v2.1.9&#xff0c;最后一个为 v2.5.13&#xff0c;主要发布小版本 2.2~2.5。这些发布提升了vue 与 TypeScript 的结合、改进了对服务端渲染&#xff08;SSR&#xff09;和 native 渲染的支持、提供了…

Sentinel(二十三)之使用Apollo存储规则

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel使用Apollo存储规则 上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则。Apollo是国内用户非常多的配置中心&#xff0c;所以&#xff0c;今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储…

jzoj3348,bzoj3258-秘密任务【最短路,网络流最小割】

正题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id3258 题目大意 一张无向图&#xff0c;路有边权&#xff0c;在想要封锁某条路可以在该路两边的任意一点设置检查站(一个站只能封锁一条路)&#xff0c;在iii点建立一个检查站要AiA_iAi​元。 求最少的费用封…

Quartz.Net分布式任务管理平台

前言&#xff1a;我相信大多数人公司的业务上都有定时任务这么个功能&#xff0c;我们公司也不例外&#xff0c;刚来公司的时候使用Quartz.Net为我们组做了第一个任务&#xff0c;大致流程是&#xff1a;新建一个控制台程序&#xff0c;引用需要的程序集&#xff0c;Execute方法…

Sentinel(二十四)之Sentinel Dashboard中修改规则同步到ZooKeeper

转载自 Springboot使用Sentinel限流&#xff0c;集成zookeeper完成规则的持久化 上一篇简单介绍了sentinel限流的基本配置和使用&#xff0c;这一篇我们来稍微深入一点&#xff0c;看看如何将zookeeper继承进来&#xff0c;用以保存添加的流控规则。 上一篇中我们启动了dash…

微软Azure AspNetCore微服务实战第2期(内附PPT下载)

2018年1月28日&#xff0c;虽然上海的大雪在城区已经见不到踪影&#xff0c;但还是很冷。不过天气再冷&#xff0c;也阻止不了小伙伴参加活动的热情。感谢王振&#xff0c;苏老师以及微软Azure API Management的产品经理Alvin&#xff0c;给大家带来微服务实战&#xff0c;企业…

jzoj3379-查询【主席树】

正题 题目大意 给出一个有序集合AAA&#xff0c;定义Al,rA_{l,r}Al,r​表示集合内l∼rl\sim rl∼r这个范围内的数。 定义加法ABABAB表示两个集合中的所有元素(不去重)。 现在询问&#xff0c;每次询问ki,pik_i,p_iki​,pi​然后给出kik_iki​个区间[lj,rj][l_j,r_j][lj​,rj…