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 ...
随机推荐
- C#XmlHelper帮助类操作Xml文档的通用方法汇总
前言 该篇文章主要总结的是自己平时工作中使用频率比较高的Xml文档操作的一些常用方法和收集网上写的比较好的一些通用Xml文档操作的方法(主要包括Xml序列化和反序列化,Xml文件读取,Xml文档节点内 ...
- Java中实现多态的机制是什么?
Java允许父类或接口定义的引用变量指向子类或具体实现类的实例对象,而程序调用的方法在运行时才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类 ...
- URL转义特定字符
import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.Charset; // 实例代码 Str ...
- 202A 202B 202C 202D 202E字符的作用及解释
这里你会发现在值的前后有2个\u开头的控制字符:转换网址:http://www.jsons.cn/utf8/ 解释:https://blog.csdn.net/haiyan1111/article/d ...
- Spring如何处理线程并发问题?
在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLoc ...
- java-servlet-cookie&sessions
http协议是无状态协议 无状态协议的意思是服务端与客户端不会记录任何一次通信的信息 服务端"和"客户端",虽然见过很多面,但每次见面仍还是认不出对方,都是陌生人. 但 ...
- OpenCV - Add Noise的一些方法
噪声常用有两种:一种椒盐噪声,一种高斯噪声. import numpy as np def pepper_and_salt(src, proportion): """ : ...
- 数据仓库(5)数仓Kimball与Inmon架构的对比
数据仓库主要有四种架构,Kimball的DW/BI架构.独立数据集市架构.辐射状企业信息工厂Inmon架构.混合Inmon与Kimball架构.不过不管是那种架构,基本上都会使用到维度建模. < ...
- js 中的submit 回调函数
1.submit.php <?php $arr = $_POST; $arr['msg']=1; //echo $_POST['uname']; echo json_encode($arr); ...
- MySQL8.0官方文档学习
InnoDB架构 下面的架构里只挑选了部分内容进行学习 内存架构(In-Memory Structures) Buffer Pool Buffer Pool是内存中的一块区域,InnoDB访问表和索引 ...