阿里开源流控框架 - Sentinel入门介绍
大家好,我是方木
前言
限流一直就是一个比较热门而又老旧的话题,但是作为应对高并发的手段之一,限流的热度一直都在。
提到限流框架,很多人可能会想到Guava
的Ratelimiter
,或者Netflix
的concuurency-limits
,又或者Spring
官方出品的Hystrix
(已经停止维护了)和替代Hystrix的Resilience4j
。
那么,如果必须要我选择一款限流的框架,那就是它 - Sentinel
Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护
等多个维度来帮助开发者保障微服务的稳定性。
Sentinel 2012年诞生,至今已有10个年头,在阿里内部积累了大量的流量生产实践经验。目前的社区活跃度很高,很多公司都在使用。
sentinel的主要功能有
流量控制
:直接限流、冷启动、排队等熔断降级
:通过并发线程数、响应时间进行限制降级系统负载保护
:提供系统维度的自适应保护能力
基础使用
让我们先从简单的例子入手
1. 引入 Sentinel 依赖
使用 Maven引入,在pom.xml
文件中加入sentinel依赖:
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.3</version>
</dependency>
2. 定义规则和资源
规则
private static void initFlowRules() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource("HelloWorld");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);// QPS 20.rule.setCount(20);rules.add(rule);FlowRuleManager.loadRules(rules);
}
资源
public static void main(String[] args) {// 配置规则initFlowRules();while (true) {// 1.5.0 版本开始可以直接利用 try-with-resources 特性try (Entry entry = SphU.entry("HelloWorld")) {// 被保护的逻辑System.out.println("hello world");} catch (BlockException ex) {// 处理被流控的逻辑System.out.println("blocked!");}}
}
也可以直接使用注解
@SentinelResource("HelloWorld")
public void helloWorld() {// 资源中的逻辑System.out.println("hello world");
}
3. 运行
可以看到,当我们设置了QPS
为20的时候,SphU.entry()
模拟请求跑了20次就会报错
我们可以查看日志~/logs/csp/${appName}-metrics.log.xxx
,日志中也记录了详情,其中 p
代表通过的请求, block
代表被阻止的请求, s
代表成功执行完成的请求个数, e
代表用户自定义的异常, rt
代表平均响应时长。
可以看到,这个程序每秒稳定输出 "hello world" 20 次
,和规则中预先设定的阈值是一样的。说明sentinel的限流策略生效了。
1646746567000|2022-03-08 21:36:07|HelloWorld|20|6863|20|0|1|0|0|0
1646746568000|2022-03-08 21:36:08|HelloWorld|20|109154|20|0|0|0|0|0
1646746569000|2022-03-08 21:36:09|HelloWorld|20|115142|20|0|0|0|0|0
1646746570000|2022-03-08 21:36:10|HelloWorld|20|134763|20|0|0|0|0|0
Sentinel 控制台
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。
Sentinel 控制台包含如下功能:
查看机器列表以及健康情况
:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。监控 (单机和集群聚合)
:通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。规则管理和推送
:统一管理推送规则。鉴权
:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
需要注意的是:
Sentinel 控制台目前仅支持单机部署。官方表示Sentinel 控制台不作为开箱即用的生产环境控制台,若希望在生产环境使用要根据文档自行进行定制和改造。
使用sentinel控制台,首先需要下载控制台 jar 包
sentinel 控制台 release 下载页面
ps:也可以自己下载源码打jar包
接着就是启动控制台
java -Dserver.port=8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
访问http://localhost:8080/
就可以看到sentinel的控制台了,默认用户名和密码都是 sentinel
此时控制台空空如也,是因为现在我们的程序是没有接入到dashboard的,
此时我们需要按照以下步骤接入到控制台
- 引入JAR包
引入 Transport
模块来与 Sentinel 控制台进行通信
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.3</version>
</dependency>
- 配置dashboard参数
server:port: 8081spring:application:name: testcloud:#sentinel控制台的请求地址sentinel:transport:dashboard: localhost:8080
编写测试接口
@GetMapping("/test")
public String testSentinel() {String resourceName = "test";Entry entry = null;String retVal;try {entry = SphU.entry(resourceName, EntryType.IN);retVal = "passed";} catch (BlockException e) {retVal = "blocked";} finally {if (entry != null) {entry.exit();}}return retVal;
}
客户端配置好了与控制台的连接参数之后,并不会主动连接上控制台,需要触发一次客户端的规则才会开始进行初始化,并向控制台发送心跳和客户端规则等信息。所以测试项目启动后访问http://localhost:8081/test
,可以看到,此时的sentinel控制台已经有我们项目启动的信息了
客户端连接上dashboard之后,我们就可以为我们定义的资源配置规则了,有两种方式可以配置规则:
- 在
流控规则
页面中新增 - 在
簇点链路
中添加
我们可以在流控规则
页面中新增,点击流控规则
进入页面,如下图所示:
也可以在簇点链路
的页面中找到我们埋点的资源名,然后直接对该资源进行增加流控规则的操作
通过这些资源的配置,就可以简单的实现项目接口的流控了。
以上就是sentinel的基本操作了,后续的文章里方木会继续讲解sentinel的深度使用以及二次开发
,感兴趣的朋友可以点个关注~
欢迎关注我的公众号:Java架构师进阶编程,回复 面试 ,获取上百份面试资源!
阿里开源流控框架 - Sentinel入门介绍相关推荐
- Django框架之入门介绍
Python下有许多款不同的Web框架.Django(发音:[`dʒæŋɡəʊ]) 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于Django. 作为Python最重要的框架之一,Dja ...
- 分布式事物框架--EasyTransaction的入门介绍
分布式事物框架--EasyTransaction的入门介绍 柔性事务,分布式事务,TCC,SAGA,可靠消息,最大努力交付消息,事务消息,补偿,全局事务,soft transaction, distr ...
- 分布式事物框架Easy-Transaction--使用入门介绍
分布式事物框架Easy-Transaction--使用入门介绍 The origin This framework is inspired by a PPT (<大规模SOA系统的分布式事务处理 ...
- symfony入门学习资料之十六:Symfony框架启动过程介绍
symfony入门学习资料之十六:Symfony框架启动过程介绍 Symfony框架的核心本质是把Request转换成Response的一个过程.从入口文件(web_dev.php)的源码可以看个大概 ...
- matlab 写入 MYSQL_阿里开源MySQL中间件Canal快速入门
前言 距离上一篇文章发布又过去了两周,这次先填掉上一篇秒杀系统文章结尾处开的坑,介绍一下数据库中间件Canal的使用. 「Canal用途很广,并且上手非常简单,小伙伴们在平时完成公司的需求时,很有可能 ...
- Go语言Web框架:Beego框架快速入门
文章目录 Beego框架快速入门 1.beego框架了解 2.MVC架构 3.环境搭建 4.beego的项目结构分析 5.Beego快速体验 6.Beego运行流程分析 7.Post案例实现 7.1前 ...
- 十九、Beego框架快速入门
Beego框架快速入门 1.框架了解 go语言的web框架:beego,gin,echo等等,那为什么我们选择beego呢? 第一,beego是中国人开发的,开发文档比较详细,beego官网网址: h ...
- 美团小程序框架mpvue入门教程
美团小程序框架mpvue入门教程 自打写了 美团小程序框架mpvue蹲坑指南, 一发不可收拾,今天趁周末空闲,来写个mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷. 另外,我还专门为本 ...
- Expression Blend实例中文教程(3) - 布局控件快速入门Grid
上一篇对Blend 3开发界面进行了快速入门介绍,本篇将基于Blend 3介绍Silverlight控件.对于微软开发工具熟悉的朋友,相信您很快就熟悉Blend的开发界面和控件. XAML概述 Sil ...
最新文章
- 视频系列:RTX实时射线追踪(上)
- 操作系统学习:Linux0.12初始化详细流程-进程退出与系统进入怠速
- 交换机端口隔离技术应用
- 在URL地址栏中显示ico
- Spring MVC的框架组件
- Android如何实现TCP和UDP传输
- 科幻电影系列-计算机技术
- java面试题7 牛客:关于AWT和Swing说法正确的是?
- 上海交大MBA学费与资助
- 这就是即将发布的苹果刘海屏MacBook Pro样机?
- C#中的深度学习:ML.NET中具有预训练模型的硬币识别
- AI队列长度检测:使用Keras进行对象检测
- socket网络字节序相关概念
- centos进程php-fpm,CentOS 6.x 开启Nginx和Php-fpm状态统计
- CSS大美集(关于细节)
- 进字节一年了,分享一下当初刷的一百多篇算法题解
- cpu(s)和%CPU的的区别
- Linux双系统安装指南
- DEMAC电机驱动型电缆卷筒—上海班品智能
- mysql高效查询_mysql 高效率查询背景