lht94

V1

2022/05/20阅读:28主题:默认主题

分布式限流组件-Sentinel

什么是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>




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定义一个规则,后续修改删除,和控制台两边会同步的

  • 测试

分类:

后端

标签:

后端

作者介绍

lht94
V1