在之前的《使用Sentinel实现接口限流》一文中,我们仅依靠引入Spring Cloud Alibaba对Sentinel的整合封装spring-cloud-starter-alibaba-sentinel,就完成了对所有Spring MVC接口的限流控制。然而,在实际应用过程中,我们可能需要限流的层面不仅限于接口。可能对于某个方法的调用限流,对于某个外部资源的调用限流等都希望做到控制。呢么,这个时候我们就不得不手工定义需要限流的资源点,并配置相关的限流策略等内容了。

今天这篇我们就来一起学习一下,如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略。

自定义资源点

下面的例子基于您已经引入了Spring Cloud Alibaba Sentinel为基础,如果您还不会这些,建议优先阅读《使用Sentinel实现接口限流》。

第一步:在应用主类中增加注解支持的配置:

@SpringBootApplicationpublic class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } // 注解支持的配置Bean @Bean public SentinelResourceAspect sentinelResourceAspect() { return new SentinelResourceAspect(); }}

第二步:在需要通过Sentinel来控制流量的地方使用@SentinelResource注解,比如下面以控制Service逻辑层的某个方法为例:

@Slf4j@Servicepublic class TestService { @SentinelResource(value = "doSomeThing") public void doSomeThing(String str) { log.info(str); }}

到这里一个需要被保护的方法就定义完成了。下面我们分别说说,定义了资源点之后,我们如何实现不同的保护策略,包括:限流、降级等。

如何实现限流与熔断降级

在定义了资源点之后,我们就可以通过Dashboard来设置限流和降级策略来对资源点进行保护了。同时,也可以通过@SentinelResource来指定出现限流和降级时候的异常处理策略。下面,就来一起分别看看限流和降级都是如何实现的。

实现限流控制

第一步:在Web层调用这个被保护的方法:

@RestControllerpublic class TestController { @Autowired private TestService testService; @GetMapping("/hello") public String hello() { estService.doSomeThing("hello " + new Date()); return "didispace.com"; }}

第二步:启动测试应用,启动Sentinel-Dashboard。发一个请求到/hello接口上,使得Sentinel-Dashboard上可以看到如下图所示的几个控制点:

可以看到,除了如之前入门实例中那样有/hello资源点之外,多了一个doSomeThing资源点。可以通过界面为这个资源点设置限流规则,比如将其QPS设置为2。由于/hello资源不设置限流规则,所以只要请求/hello接口,就可以直接模拟调用doSomeThing资源,来观察限流规则是否生效。

下面可以通过任何你喜欢的工具来调用/hello接口,只要QPS超过2,那么就会出现如下的错误返回,代表限流策略生效了。

此时,服务端的控制台也会有对应的限流报错日志:

2019-06-27 11:30:43.514 INFO 36898 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService : aaa2019-06-27 11:30:43.905 ERROR 36898 --- [nio-8001-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root causecom.alibaba.csp.sentinel.slots.block.flow.FlowException: null

实现限流的异常处理

默认情况下,Sentinel对控制资源的限流处理是直接抛出异常,也就是上一节中贴出的日志内容。在没有合理的业务承接或者前端对接情况下可以这样,但是正常情况为了更好的用户业务,都会实现一些被限流之后的特殊处理,我们不希望展示一个生硬的报错。那么只需要基于上面的例子做一些加工,比如:

@Slf4j@Servicepublic class TestService { @SentinelResource(value = "doSomeThing

slf4j注解log报错_这个注解一次搞定限流与熔断降级:@SentinelResource相关推荐

  1. slf4j注解log报错_SpringBoot自定义日志注解,用于数据库记录操作日志,你用过吗?...

    大家好,我是程序员7歌! 今天我将为大家讲解如何通过自定义注解记录接口访问日志.一般的开发中,有两种方式可以记录日志信息,第一种:把接口日志信息保存到日志文件中,第二种:把接口操作日志保存到数据库中, ...

  2. Spring Cloud Alibaba基础教程:@SentinelResource注解实现限流控制与熔断降级使用详解

    在之前的<使用Sentinel实现接口限流>一文中,我们仅依靠引入Spring Cloud Alibaba对Sentinel的整合封装spring-cloud-starter-alibab ...

  3. Spring循环引用-@Async注解启动报错,而@Transactional则不会

    目录 一.问题描述 二.问题分析 1.代理类 2.代理过程 三.结论 上接<Spring循环引用-@Async注解启动报错分析> 一.问题描述 Bean1Service注解@Async 启 ...

  4. 解决非controller使用@Autowired注解注入报错为java.lang.NullPointerException问题

    解决非controller使用@Autowired注解注入报错为java.lang.NullPointerException问题 参考文章: (1)解决非controller使用@Autowired注 ...

  5. IDEA中实现接口时注解@Override报错的解决方法

    IDEA中实现接口时注解@Override报错的解决方法 参考文章: (1)IDEA中实现接口时注解@Override报错的解决方法 (2)https://www.cnblogs.com/liulao ...

  6. 关于Servlet中注解:@WebServlet注解一直报错的解决办法

    开始试过网上的办法,导入servlet-api和jsp-api包到项目里面,但是@WebServlet注解报错却解决不了,对比之前能运行的项目,发现这两个包是要导进来,但是不是直接导入项目的lib下, ...

  7. 安装MHA中清理Relay log报错

    安装MHA中清理Relay log报错 [root@MHA3 ~]#  /usr/bin/purge_relay_logs --user=root --password=123456 -disable ...

  8. mysql 5.6.23 源码包安装报错_大环境下MySQL5.6源码安装实战一步步教你 CentOS6.5_64bit下编译安装...

    一.关闭防火墙 chkconfig iptables off service iptables stop 二.检查操作系统上是否安装了MySQL [[email protected] backup]# ...

  9. Communication error with Jack server , try ‘jack-diagnose‘ or see Jack server log 报错解决办法

    创作不易,请尊重原创,转载注明出处: https://blog.csdn.net/An_Times/article/details/121334749 Communication error with ...

最新文章

  1. 制作欧比旺·克诺比逼真的CG角色学习教程
  2. 【总结】Kylin LDAP配置
  3. 基于python的聊天软件的设计与实现_Python基于TCP实现会聊天的小机器人功能示例...
  4. java数据结构基础名词解释
  5. 小红书 “红”到翻车:你的骚操作闪了我的腰?
  6. Hive的10种常用优化总结,再也不怕MapReduce分配不均了
  7. Java网络编程之服务端中的Socket
  8. EditPlus配置Java运行环境
  9. Excel怎么快速对比两个工作表的异同
  10. 51单片机两只老虎c语言程序,源码共享:51单片机上实现7首简单音乐的汇编代码...
  11. 实施MES系统的成功率只有50%,你知道为什么吗?
  12. jsp、servlet与javabean的区别180110
  13. Windows系统重装系统和激活
  14. SWUSTOJ #77 计算员工周工资
  15. 访问认证(三):Bearer
  16. 用户行为分析(如何用数据驱动增长)-读书笔记2
  17. 考研概率论与数理统计(知识点梳理)
  18. CRC 循环冗余检验【计网必考】
  19. 数据方舟插件_数据方舟 for Excel工具箱使用说明
  20. 简单网页设计(苍兰诀)html+css

热门文章

  1. Python版双链表结构与有关操作
  2. C语言 如何判断一个主机是大端还是小端
  3. 基于MVC的jpetstore项目分析
  4. svn提交提示服务器文件被锁,svn被锁定怎么解决-svn被锁定的解决方法 - 河东软件园...
  5. QT每日一练day27:绘制不规则窗体
  6. QT每日一练day15:QColorDialog颜色对话框
  7. 计算机上配置的网卡实际上是,()计算机上配置的网卡,实质上是_ ___。
  8. Linux离线的nginx安装启动,linux-离线安装nginx
  9. php 动态参数,PHP 动态配置运行时环境参数ini_xxx,extension_loaded
  10. red hat linux综合实验报告,实验一 Red Hat Linux 9.doc