SpringBoot进阶教程(六十八)Sentinel实现限流降级
前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Sentinel。
Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。历次在双十一大促等核心场景的应用更是使其大放异彩。今天就来介绍介绍Alibaba sentinel。
vsentinel主要特性

图片来源于网络,侵删。
vLinux sentinel安装与部署
1.1 下载sentinel_dashboardjar包
可以在https://github.com/alibaba/Sentinel/releases找到合适的版本,当前最新版本sentinel-dashboard-1.8.0.jar下载
1.1 部署
 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8858 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar 
-Dserver.port=8080 代表看板项目的端口号,-Dcsp.sentinel.dashboard.server=localhost:8858代表本dashboard服务将会被注册,-Dproject.name=sentinel-dashboard代表本身服务的项目名称。访问localhost:8858;输入用户名,密码(用户名/密码默认值sentinel)。
也可以自定义用户名密码,在启动命令加上 -Dsentinel.dashboard.auth.username=toutou -Dsentinel.dashboard.auth.password=123456 。
vdocker sentinel安装与部署
我在虚拟机装了docker,所以下文中实例中讲解的部分,是基于docker的sentinel。若未安装docker的朋友可以看看这篇文章Docker从安装部署到Hello World。
2.1 拉取sentinel镜像
 docker pull bladex/sentinel-dashboard:1.8.0 

2.2 创建容器
 docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard:1.8.0 
2.3 启动容器
 docker start sentinel 
v验证安装效果
访问 http://ip:8858/ 

上文已经介绍了,使用用户名/密码默认值sentinel登录。

默认会有一个sentinel-dashboard。
vspringboot整合sentinel
3.1 添加依赖pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
3.2 添加配置application.properties
spring.cloud.sentinel.transport.port=9719
spring.cloud.sentinel.transport.dashboard=toutou.com:8858
3.3 添加兜底方法
/**
* @author toutou
* @date by 2020/12
* @des https://www.cnblogs.com/toutou
*/
@Slf4j
public class BlockHandlerUtil {
public Result message(BlockException blockExe){
log.info(blockExe.toString());
return Result.setErrorResult(555, "网络拥堵,请稍后再试。");
}
}
3.4 添加controller
/**
* @author toutou
* @date by 2020/12
* @des https://www.cnblogs.com/toutou
*/
@Slf4j
@RestController
public class IndexController {
@GetMapping("/hello")
@SentinelResource(value="hello",blockHandlerClass = BlockHandlerUtil.class, blockHandler = "message")
public Result hello(@RequestParam(value = "name",defaultValue = "toutou",required = false)String name){
return Result.setSuccessResult("hello " + name);
}
}
3.5 @SentinelResource注解
@SentinelResource可以涵盖Sentinel的大部分应用场景,所以搞懂@SentinelResource就能更好的使用Sentinel。
| 属性名 | 是否必填 | 说明 | 
|---|---|---|
| value | 是 | 资源名称 。(必填项,需要通过 value 值找到对应的规则进行配置) | 
| entryType | 否 | entry类型,标记流量的方向,取值IN/OUT,默认是OUT | 
| blockHandler | 否 | 处理BlockException的函数名称(可以理解为对Sentinel的配置进行方法兜底)。函数要求: 1.必须是 public 修饰 2.返回类型与原方法一致 3. 参数类型需要和原方法相匹配,并在最后加 BlockException 类型的参数。 4. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 blockHandlerClass ,并指定blockHandlerClass里面的方法。  | 
| blockHandlerClass | 否 | 存放blockHandler的类。 对应的处理函数必须 public static 修饰,否则无法解析,其他要求:同blockHandler。  | 
| fallback | 否 | 用于在抛出异常的时候提供fallback处理逻辑(可以理解为对Java异常情况方法兜底)。 fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求: 1.返回类型与原方法一致 2.参数类型需要和原方法相匹配,Sentinel 1.6开始,也可在方法最后加 Throwable 类型的参数。 3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定fallbackClass里面的方法。  | 
| fallbackClass | 否 | 存放fallback的类。 对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。  | 
| defaultFallback | 否 | 用于通用的 fallback 逻辑。 默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求: 1.返回类型与原方法一致 2.方法参数列表为空,或者有一个 Throwable 类型的参数。 3.默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定 fallbackClass 里面的方法。  | 
| exceptionsToIgnore | 否 | 指定排除掉哪些异常。 排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。  | 
| exceptionsToTrace | 否 | 需要trace的异常 | 
vSentinel 控制台
用浏览器打开http://localhost:8301/hello,这时Sentinel 控制台相关的可配置菜单和可视化界面的参数就会对应的展示出来。

4.1 添加流控规则

在"簇点链路"中可以添加各种规则,比如我们添加的"流控",添加以后便可以在"流控规则"中查看。

4.2 ab test测试
使用ab test测试工具测试下流控规则, ab -n 30 -c 5 http://localhost:8301/hello 。如果ab test不会用的,可以看看这篇文章ab test压力测试。

上图是Sentinel 控制台中的实时监控,可以看出流控规则已经生效。同时我们用浏览器访问http://localhost:8301/hello,效果如下图,可以看到返回值与我们设置的code一致。

4.3 降级规则

参数说明:

v源码地址
https://github.com/toutouge/javademosecond/tree/master/hellolearn
作  者:请叫我头头哥
        
        出  处:http://www.cnblogs.com/toutou/
        
        关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
        
        版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
        
        特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
        
        声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
#comment_body_3242240 { display: none }
SpringBoot进阶教程(六十八)Sentinel实现限流降级的更多相关文章
- SpringBoot进阶教程(六十四)注解大全
		
在Spring1.x时代,还没出现注解,需要大量xml配置文件并在内部编写大量bean标签.Java5推出新特性annotation,为spring的更新奠定了基础.从Spring 2.X开始spri ...
 - SpringBoot进阶教程(六十五)自定义注解
		
在上一篇文章<SpringBoot进阶教程(六十四)注解大全>中介绍了springboot的常用注解,springboot提供的注解非常的多,这些注解简化了我们的很多操作.今天主要介绍介绍 ...
 - SpringBoot进阶教程(六十)intellij idea project下建多个module搭建架构(上)
		
在 IntelliJ IDEA 中,没有类似于 Eclipse 工作空间(Workspace)的概念,而是提出了Project和Module这两个概念.多module有一个父maven工程,多个子工程 ...
 - SpringBoot进阶教程(二十八)整合Redis事物
		
Redis默认情况下,事务支持被禁用,必须通过设置setEnableTransactionSupport(true)为使用中的每个redistplate显式启用.这样做会强制将当前重新连接绑定到触发m ...
 - SpringBoot进阶教程(六十二)整合Kafka
		
在上一篇文章<Linux安装Kafka>中,已经介绍了如何在Linux安装Kafka,以及Kafka的启动/关闭和创建发话题并产生消息和消费消息.这篇文章就介绍介绍SpringBoot整合 ...
 - SpringBoot进阶教程(六十九)ApplicationContextAware
		
在某些特殊的情况下,Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器实现该功能.为了让Bean获取它所在的 ...
 - SpringBoot进阶教程(六十一)intellij idea project下建多个module搭建架构(下)
		
在上一篇文章<SpringBoot进阶教程(六十)intellij idea project下建多个module(上)>中,我们已经介绍了在intellij idea中创建project之 ...
 - SpringBoot进阶教程(二十九)整合Redis 发布订阅
		
SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...
 - SpringBoot进阶教程(五十九)整合Codis
		
上一篇博文<详解Codis安装与部署>中,详细介绍了codis的安装与部署,这篇文章主要介绍介绍springboot整合codis.如果之前看过<SpringBoot进阶教程(五十二 ...
 
随机推荐
- cheat.sh在手,天下我有
			
前言 作为程序员需要了解的东西有很多,日常编码和写脚本脱离不开各式语言与 Linux 命令.为了记住一些杂乱的或不被经常使用的知识点,我们迫切需要一个"小抄"/备忘录,小抄内容多了 ...
 - 区块链V1版本实现之一
			
1. 程序地址:https://gitee.com/Jame_sz/beijing_go_term2.git 2. 程序编写流程: //1. 定义结构(区块头的字段比正常的少) //>1. 前区 ...
 - Beta冲刺——总结
			
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 团队GitHub地 ...
 - js预解析练习
			
分析下面两段代码 console.log(num)//undefined var num = 10 f()//可以执行 //f2()不可以执行 console.log(f)//function con ...
 - (七)if/else就是goto
			
一.CPU如何执行指令 CPU上有数以亿计的晶体管组层的复杂电路,我们先不用管具体电路如何实现:逻辑上我们可以认为CPU由许多寄存器组成,而这些寄存器又由许多锁存器和触发器组成,N个锁存器或触发器就可 ...
 - 赶紧收藏吧!MyBatis-Plus万字长文图解笔记,错过了这个村可就没这个店了
			
简介 MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生 愿景 我们的愿景是成为 MyBatis 最好的搭档 ...
 - PyQt(Python+Qt)学习随笔:gridLayout的layoutRowMinimumHeight和layoutColumnMinimumWidth属性
			
Qt Designer中网格布局(gridLayout)中,layoutRowMinimumHeight和layoutColumnMinimumWidth两个属性分别设置网格布局中各行的最小高度和各列 ...
 - XSS挑战赛(1)
			
以前囫囵吞枣做过一遍,现在从头再来 第一关网址为:http://127.0.0.1/xss-labs-master/level1.php?name=test 而页面上显示了用户test,name可控, ...
 - js- for in 循环 只有一个目的,遍历 对象,通过对象属性的个数 控制循环圈数
			
for in 循环会返回 原型 以及原型链上面的属性,不会打印系统自带的属性 var obj ={ name:'suan', sex :'male', age:150, height:185, ...
 - 软工个人项目  ——wc.exe
			
1.GitHub项目地址 https://github.com/k8kiw/WordCount 2.PSP预计时间 PSP2.1 Personal Software Process Stages 预估 ...