随着分布式系统变得越来越流行,服务之间的可靠性变得比以往任何时候都更加重要。Sentinel是一个强大的流控组件,以“流”为切入点,涵盖流控、并发限制、熔断、自适应系统保护等多个领域,保障微服务的可靠性。
Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。
官网:https://github.com/alibaba/Sentinel/wiki
2012年,Sentinel诞生于阿里巴巴,其主要目标是流量控制。2013-2017年,Sentinel迅速发展,并成为阿里巴巴所有微服务的基本组成部分。 它已在6000多个应用程序中使用,涵盖了几乎所有核心电子商务场景。2018年,Sentinel演变为一个开源项目。2020年,Sentinel Golang发布。
Sentinel的特征丰富的应用场景 :Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控 :Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态 :Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 SpringCloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
生态 Sentinel的主要特性关于Sentinel与Hystrix的区别见:https://yq.aliyun.com/articles/633786/
流量控制Sentinel 提供了根据需要根据适当的形状处理随机传入请求的能力,如下图所示:
流量控制原理
流量控制基于以下统计信息:
资源之间的调用链;
运行时指标,例如 QPS、响应时间和系统负载;
需要采取的行动,例如立即拒绝或排队。
Sentinel 允许应用程序以灵活的方式组合所有这些统计信息。
最大并发限制
Sentinel 没有使用线程池,而是通过限制并发线程的数量(即信号量隔离)来减少不稳定资源的影响。
当资源的响应时间变长时,线程就会开始被占用。当线程数累积到一定数量时,将拒绝新传入的请求。反之,当资源恢复稳定后,占用的线程也会被释放,接受新的请求。
通过限制并发线程而不是线程池,您不再需要预先分配线程池的大小,从而避免排队、调度和上下文切换等计算开销。
Sentinel如何工作? 如何使用?由于官网的示例特别清晰,这里只简单介绍一下,比较难得地方
官网:Spring Cloud Alibabasentinel
- 引入pom文件
com.alibaba.cloud spring-cloud-starter-alibaba-sentinel com.alibaba.csp sentinel-core com.alibaba.csp sentinel-datasource-nacos com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
-
通过编码的方式进行本地限流
这种方式非常简单:sentinel如何使用
-
持久化规则到nacos
前提时安装好了nacos和sentinel控制台(控制台安装教程)
1, 引入上述全部依赖
2, 配置nacos
定义一个bootstrap.yml文件,写入
# Spring
spring:
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: xxx.xxx.xx.xx:8848
config:
# 配置中心地址
server-addr: xxx.xxx.xx.xx:8848
# 配置文件格式
file-extension: yml
#配置文件名称dataId
name: cloud-sentinel.yml
在application种配置好sentinel
spring:
cloud:
sentinel:
transport:
# 控制台地址
dashboard: localhost:8080 #sentinel
port: 8719
#配置nacos后一定要配置datasource,否则本地规则会失效
datasource:
flow: #flow是数据源名,可以自行随意修改
nacos:
server-addr: 47.99.216.57:8848
dataId: ${spring.application.name}-flow-rules
groupId: SENTINEL_GROUP
data-type: json
rule-type: flow
application:
name: cloud-sentinel
- 定义一个接口
@GetMapping("/anno")
@ResponseBody
@SentinelResource(value = "cloud-sentinel-flow-rules",blockHandler = "handleException")
public String getOrder1() {
return "访问正常";
}
@ResponseBody
public String handleException(BlockException exception){
return "熔断、限流成功"+exception.getClass().getCanonicalName();
}
- 定义一个规则
[{"app":"cloud-sentinel","clusterConfig":{"fallbackToLocalWhenFail":true,"sampleCount":10,"strategy":0,"thresholdType":0,"windowIntervalMs":1000},"clusterMode":false,"controlBehavior":0,"count":1.0,"gmtCreate":1634713185810,"gmtModified":1634713608918,"grade":1,"id":11,"ip":"172.28.112.1","limitApp":"default","port":8720,"resource":"cloud-sentinel-flow-rules","strategy":0}]
在nacos定义一个规则,后续修改删除,和控制台两边会同步的
- 测试



