高可用流量控制组件限流之sentinel
标签: 高可用流量控制组件限流之sentinel JavaScript博客 51CTO博客
2023-04-30 18:24:07 192浏览
什么是Sentinel?
随着分布式系统变得越来越流行,服务之间的可靠性变得比以往任何时候都更加重要。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 Alibaba Sentinel
- 引入pom文件
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
<!-- 持久化到nacos时使用,本地规则限流可以不用 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 通过编码的方式进行本地限流
这种方式非常简单: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定义一个规则,后续修改删除,和控制台两边会同步的

- 测试

好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论


