sentinel基础概念及使用
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人。
文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。
什么是sentinel
- sentinel是Spring Cloud Alibaba的一个重要组件,类似于spring clound的hystrix,与hystrix-dashboard控制台一样,sentinel-dashboard控制台可以提供对流量的实时监控、在线维护流量规则、熔断规则,前提是微服务整合了sentinel
- 对比hystrix
| Sentinel | Hystrix | |
|---|---|---|
| 隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
| 熔断降级策略 | 基于响应时间或失败比率 | 线程池隔离/ 基于响应时间或失败比率 |
| 实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
| 规则配置 | 支持多种数据源 | 支持多种数据源 |
| 扩展性 | 多个扩展点 | 插件的形式 |
| 基于注解的支持 | 支持 | 支持 |
| 限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 |
| 流量整形 | 支持慢启动、匀速器模式 | 不支持 |
| 系统负载保护 | 支持 | 不支持 |
| 控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
| 常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
hystrix官方已停止更新,而sentinel则保持着开源
基础概念
- Resource:资源resource可以是代码块、方法(普通方法、接口)等,把它们定义为资源后,再定义限流规则,就可以结合sentinel使用了
- Slot插槽:sentinel中定义了7种slot插槽,sentinel正是通过各个插槽间的固定调用顺序来实现限流的,因为后面的插槽可能依赖于前面插槽的计算结果
- Entry:是否通过限流的凭证,sentinel有三种形式来定义资源
- 调用SphU.entry("资源")来定义资源:定义成功则返回一个Entry对象,否则抛出异常以拒绝往下执行限流代码,代表此资源已被定义,需要执行其他处理代码,不管是否成功定义资源最后都要执行entry.exit()退出资源
- 调用SphO.entry("资源")来定义资源:返回true表示定义成功,若定义资源失败则返回false以拒绝往下执行限流代码,需要执行其他处理代码,不管是否成功定义资源最后都要执行SphO.exit()退出资源调用
- 注解的方式定义资源:上面两种方式对代码侵入性很高,可用@SentinelResource注解的方式作用于方法上,并配置blockHandler指定限流处理方式
- Node节点:DefaultNode=链路节点,可统计调用链路上某个资源的数据;ClusterNode=簇节点,可统计某个资源的全局数据;StatisticNode=基础节点,其数据结构有秒级/分钟级别的滑动窗口结构;EntranceNode=入口节点,包含一些入口数据
- Context:上下文,ThreadLocal传递,包含一次链路调用的所有信息,如链路节点DefaultNode,入口节点EntranceNode
使用sentinel:定义限流规则及定义资源
- 引入依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.7.1</version>
</dependency>
- 定义规则及定义资源
规则是要作用于资源上的,下面先定义规则,再用【SphU.entry()】或【SphO.entry()】或注解的形式定义资源:
public class demo {
public static void main(String[] args) {
// 定义规则
initFlowRules();
//用SphU.entry()的形式定义资源
while (true) {
try (Entry entry = SphU.entry("myResource")) {//与规则定义中的rule.setResource("myResource")一致
// 被保护的业务逻辑...
System.out.println("业务资源访问成功!");
} catch (BlockException ex) {
// 处理被流控的逻辑:限流或降级...
System.out.println("资源访问失败!!!");
} finally {
if (entry != null) {
entry.exit();//必须退出资源调用
}
}
}
//用SphO.entry()的形式定义资源
while (true) {
if(SphO.entry("myResource")){//与规则定义中的rule.setResource("myResource")一致
try{
// 被保护的业务逻辑...
System.out.println("业务资源访问成功!");
} catch (BlockException ex) {
// 处理被流控的逻辑:限流或降级...
System.out.println("资源访问失败!!!");
}finally{
SphO.exit();//必须退出资源调用
}
}
}
//上面两种方式对代码侵入性很高,可用注解的方式定义资源
while(true){
getUserById("111");
}
}
//定义规则
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();// 存储规则 FlowRule
FlowRule rule = new FlowRule();
rule.setResource("myResource"); // 指定限流规则作用于哪个资源上,资源名为字符串,可为任意有标识意义的方法名/接口名/其他字符串,此处资源名为"myResource"
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 限流类型为QPS模式:限制QPS
rule.setCount(10); // QPS不得超出10
rule.setLimitApp("default"); // 针对的调用来源,default代表不区分来源
rules.add(rule);
FlowRuleManager.loadRules(rules);// 加载规则
}
//定义"myResource"资源,并设置违背sentinel流控规则时的处理方法handlerException()
@SentinelResource(value="myResource",blockHandler="handlerException")
public User getUserById(String id){
return new User("数据库用户");
}
//注意:此处理方法的参数必须和定义资源的方法getUserById参数一致()同时加上【BlockException exception】参数
public User handlerException(String id,BlockException exception){
return new User("流控用户");
}
}
Entry entry = null;
try {
entry = SphU.entry("myResource"); //此处说明资源
// 被保护的业务逻辑
...
} catch (BlockException e1) {
// 资源访问阻止,被限流或被降级,进行相应的处理操作
...
} finally {
if (entry != null) {
entry.exit();
}
}
单独启动sentinel
- 下载sentinel-dashboard-1.6.0.jar包(++链接++),启动:java -jar
-Dserver.port=8888 sentinel-dashboard-1.6.0.jar

访问localhost:8888登录sentinel-dashboard控制台,默认用户名/密码是sentinel/sentinel

可以看到控制台没有对任何的微服务进行流量监控项目整合sentinel
- pom.xml引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 在项目的properties文件中加入:
spring.clound.sentinel.transport.dashboard=localhost:8888 #设置sentinel控制台的地址
spring.application.name=myapp #项目名
- 浏览器访问该项目后,再次回到sentinel控制台,可以看到myapp项目中所有对controller接口的监控,可以在左侧“簇点链路”新增流控规则,设置每个接口的QPS(每秒允许访问多少次)


OK,如果文章哪里有错误或不足,欢迎各位留言。
创作不易,各位的「三连」是二少创作的最大动力!我们下期见!
sentinel基础概念及使用的更多相关文章
- sentinel 核心概念
编者注:前段时间笔者在团队内部分享了sentinel原理设计与实现,主要讲解了sentinel基础概念和工作原理,工作原理部分大家听了基本都了解了,但是对于sentinel的几个概念及其之间的关系还有 ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- TCP/IP基础概念及通信过程举例
TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...
- Jmeter基础之---jmeter基础概念
Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...
- 快速入门系列--WCF--01基础概念
转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...
- 理解 angular2 基础概念和结构 ----angular2系列(二)
前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...
- JavaBean 基础概念、使用实例及代码分析
JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...
- RabbitMQ基础概念详细介绍
http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...
- linux设备驱动归纳总结(二):模块的相关基础概念【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...
随机推荐
- 羽夏看Win系统内核——内存管理篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- 一个关于wait/notify与锁关系的探究
wait/notify 机制是解决生产者消费者问题的良药.它的核心逻辑是基于条件变量的锁机制处理.所以,它们到底是什么关系?wait()时是否需要持有锁? notify()是否需要持有锁?先说答案:都 ...
- 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.例如,对于如下语句: final StringBuilder a=new StringBuilder ...
- Constant Pool和String Constant Pool详解
Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太明白Constant Pool到底是个怎 ...
- Mac安装swoole中遇到的问题
转:https://blog.csdn.net/lishanleilixin/article/details/96137272 1:下载swoole源码,https://github.com/swoo ...
- Javascript Promises学习
Promise对象的三个状态 pending(进行中) fulfilled(已成功) rejected(已失败) Promise代表一个异步操作,对象的状态一旦改变,就不会再改变 Promise构造函 ...
- Java 中,编写多线程程序的时候你会遵循哪些最佳实践?
这是我在写 Java 并发程序的时候遵循的一些最佳实践: a)给线程命名,这样可以帮助调试. b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步. c)如果可以,更偏向于使用 volati ...
- vue中ajax请求发送
示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- 遇到的错误之"Exception in thread “main“ java.lang.NoClassDefFoundError: org/apache/velocity/context/Context at"
问题 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/velocity/context/ ...
- (stm32f103学习总结)—stm32定时器中断
一.定时器介绍 STM32F1的定时器非常多,由2个基本定时器(TIM6.TIM7).4个通 用定时器(TIM2-TIM5)和2个高级定时器(TIM1.TIM8)组成.基本定 时器的功能最为简单,类似 ...