Sentinel限流
点击上方“技术支持联盟”,选择“置顶公众号”
第一时间了解程序员大小事儿
作者:老刘头丶
作者简介:从事程序员这个行业之前是在艾泽拉斯拯救世界的脚男。
引言:由于近期实现的需求中有对请求流量限制的需求。故对阿里开源sentinel 进行了深入学习。
Sentinel是什么?
分布式系统的流量防卫兵。官网介绍如下:随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
1、丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
2、完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
3、广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
4、完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性:
Sentinel 的开源生态:
Sentinel 分为两个部分:
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
官方文档参考:https://github.com/alibaba/Sentinel/wiki
0 2Sentinel的优势
1.有控制台项目,部署成功后可打开控制面板,界面非常友好,并且支持实时监控。
2.多种限流支持和策略。支持QPS限流,线程数限流,策略如:快速失败、Warm Up、排队等待等
3.多种降级模式,支持按平均返回时间降级,按多种异常数降级,按异常比率降级
4.支持链路的关联,按链路统计限流,系统保护,热门资源保护等等。
5.支持在线热更新,随时改动随时生效,无效重启项目,方便快捷,根据预设的规则,结合对资源的实时统计信息,对流量进行控制。通过Sentinel开放的接口,可以方便的定义及改变规则。
6.支持阿里全家桶持续集成。
可参考:(https://github.com/spring-cloud-incubator/spring-cloud-alibaba )
03Sentinel 限流部分在项目中的应用
由于近期项目有对接口流量控制的需求,故对Sentinel 限流部分进行了详细的研究和学习,在此分享给大家参考。
注:
1.默认jdk环境为1.8,低于1.8版本请注意: 从 Sentinel 1.5.0 开始仅支持 JDK 1.7 或者以上版本。Sentinel 1.5.0 之前的版本最低支持 JDK 1.6。
2.默认maven 构建工程。
3.默认使用注解方式使用sentinel(还可以使用手工埋点)
4.主要针对传统非springCloud应用使用进行配置讲解。SpringCloud 的配置官网写的很好,很清晰,就不再赘述了。
5.sentinel功能非常丰富,文档内容很多很复杂,本部分主要简单配置实现了一下接口限流,降级,热点,授权等功能未说明。
6.本文只按照Spring AOP 形式实现了集群接口限流,sentinel在官方文档中有各种各样的配置方式,非常多,此文只按 Spring AOP方式最合适的方式配置,若要了解其他方式的配置,请自行查阅官方文档。
7.由于Sentinel 的配置都是存储在内存中,没有注册中心和配置中心的话,项目重启配置就会丢失,故采用了本地文件方式实现动态规则(近期看文档还可以使用Redis 作为DataSource)。
在应用中引入Sentinel 相关Jar包
关于jar包其实使用什么就要加什么依赖,这个其实是最麻烦的,如果使用阿里全家桶的依赖就简单多了,要不然就要一点一点啃官方文档,找需要的jar。
阿里全家桶依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
本次使用的依赖:
1.7.2
com.alibaba.csp
sentinel-core
${sentinel.version}
com.alibaba.csp
sentinel-annotation-aspectj
${sentinel.version}
com.alibaba.csp
sentinel-transport-simple-http
${sentinel.version}
com.alibaba
fastjson
com.alibaba.csp
sentinel-datasource-extension
${sentinel.version}
com.alibaba.csp
sentinel-cluster-client-default
${sentinel.version}
com.alibaba.csp
sentinel-cluster-server-default
${sentinel.version}
com.alibaba.csp
sentinel-parameter-flow-control
${sentinel.version}
注册注解配置为一个 Spring Bean
@Configuration
public class SentinelAspectConfiguration {
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}
配置启动项
启动项其实有好多配置的东西在里面,此部分配置是为了对接控制台,详细的配置可参考官网文档。一、打造先于用户发现并解决问题的能力
其中:
System.setProperty("csp.sentinel.dashboard.server", run.getEnvironment().getProperty("sentinel.dashboard.server", "10.7.8.7:8080"));
参数sentinel.dashboard.server ,在配置文件application.yml 中配置控制台地址来对接控制台
官方文档地址:
https://github.com/alibaba/Sentinel/wiki/%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%A1%B9
启动项其实有好多配置的东西在里面,此部分配置是为了对接控制台,详细的配置可参考官网文档。
其中:
System.setProperty("csp.sentinel.dashboard.server", run.getEnvironment().getProperty("sentinel.dashboard.server", "10.7.8.7:8080"));
参数sentinel.dashboard.server ,在配置文件application.yml 中配置控制台地址来对接控制台
官方文档地址:
https://github.com/alibaba/Sentinel/wiki/%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%A1%B9
动态规则配置
通过查找资料找到的本地文件实现规则的方式为:
1.在项目的resource 下新建文件,文件内容为指定的配置类
META-INF/services/com.alibaba.csp.sentinel.init.InitFunc
2.此处要注意,这个配置是要生成规则的json文件的,项目启动的文件夹不能有特殊字符和中文,否则会导致创建文件失败导致功能失效。
3.配置类代码如下:
参考文章:
https://blog.youkuaiyun.com/admin1973/article/details/85764525
限流配置
在接口上使用注解方式配置
@SentinelResource(value = "sentinel-----", blockHandler = "getCashPoolHandler")
其中 value 是指限流资源名,这个是在控制台中配置规则的时候使用的。blockHandler 是指限流异常使用的方法,此处作为限流提示处理了。
控制台配置
A.下载地址:
1.jar包:https://github.com/alibaba/Sentinel/releases
2.代码(自行构建版):https://github.com/alibaba/Sentinel/tree/master/sentinel-dashboard
3.Docker也可以部署,自行 docker search ** 吧。
本文采用的方式是通过下载官方release包启动的控制台。
B.启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本,下载完毕后,请安装JDK1.8及以上版本,并配置好环境变量。
C.启动命令:
java
-Dserver.port=8080
-Dsentinel.dashboard.auth.username=payment
-Dsentinel.dashboard.auth.password=Payment123!
-Dcsp.sentinel.dashboard.server=localhost:8080
-jar sentinel-dashboard.jar
-运行端口
-登录控制台用户名
-登录控制台密码
-监听控制台本身(个人感觉没啥意义)
-启动 jar ,注意jar 包版本, 第一次启动建议 不要后台启动,先看看控制台有没有报错,正常运行成功了再加上 nohup ---- & 。
注意:
控制台尽量不要和项目部署在同一个机器上,否则会发生冲突问题,导致项目注册失败,此时可以更改控制台相关端口,和项目pid日志(也就是项目启动项的System.setProperty("csp.sentinel.log.use.pid", "true"); 这部分)来解决。要是不行,多换几个端口啥,之前发现同一个机器部署这个有问题就是冲突了。
控制台官方文档地址:
https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0
限流资源配置
此时,若无报错等问题,项目正常启动,控制台正常启动,那么打开控制台就可以看到机器列表的健康状态。
然后就可以开始配置限流了
集群流控
针对于集群流控,官方提供两种模式 独立模式 和 嵌入模式
官方文档:
https://github.com/alibaba/Sentinel/wiki/%E9%9B%86%E7%BE%A4%E6%B5%81%E6%8E%A7
集群流控要指定TokenServer
通过此菜单配置:
可以根据业务需求,选择不同的模式
注:集群流控一定要实现动态规则配置,否则无法实现集群流控,就算配置了,也是会退化为单机模式。
历史文章
解决方案:
基于公有云实时音视频通道的构建音视频组件方法与实战经验
分布式定时任务调度探讨
阿里云OSS JavaAPI分享
Jmeter压测的使用
API接口安全优化浅谈
基于idea将传统应用maven化改造实践
安全漏洞预扫小工具
Nacos作为注册中心,配置中心部署方案
Rancher+K8S简化学习环境搭建方案
Excel大数据量解析优化方案
Sharding-JDBC个性化分表方案
基于JWT的接口权限认证
Spring Cloud Gateway实现限流
公网发布的通用技术解决方案
Nginx结合Lua实现限流
Mysql数据同步Canal方案
Weblogic部署基于Spring Cloud项目应用实例
智能验证码解析java语言实现
数据库的演绎与变迁-下架最后一台小型机
关于struts架构通过引入spring包实现dubbo调用测试的未来式
架构系列:
架构师入门系列:架构三板斧“缓存,消息,异步”
监控&运维
redis监控工具-redislive
微服务链路追踪工具 Apache SkyWalking部署与实践
快速发现生产环境SQL问题
Grafana-业务数据监控实践
自动化运维能力提升
服务器监控及问题定位排除
基于Spring Boot Admin告警之应用状态告警
Ansible在自动化运维中的使用
自助迁发分支工具
大数据
基于CDH集群的大数据项目的优化总结
Oracle实时同步大数据平台解决方案
实时流关联维表解决方案
中间件
浅谈Elasticsearch的资源分配
Apache Kafka使用规范Elasticsearch安装及使用
SSDB介绍及使用
RabbitMq使用简单介绍
Spring Cloud常用组件介绍
前端
ESLint + Prettier 规范前端代码
Vue.js对WinXP系统对兼容性
关于采集操作系统、浏览器版本的设计方案及一些浏览器兼容性问题处理
安卓动态加载SO文件
对浏览器的理解及兼容移动端H5本地化方案调研和实践
自适应网页设计
短信/浏览器唤起APP方案
基础知识
Sonar简介
JVM基础系列1:JVM内存模型介绍
JVM基础系列2:JVM配置参数和Java内存模型
JVM基础系列3 虚拟机字节码执行引擎
开发规范
Java异常处理规范
战略方向
金融保险系统开源浪潮下机遇与挑战
项目实战
客户为中心,统筹协调,把控风险
让我们的管理看的见

请识别下方二维码,关注 技术支持联盟
需要交流Sentinel限流技术的,欢迎扫码进群