美文网首页java尝鲜
Alibaba限流组件Sentinel

Alibaba限流组件Sentinel

作者: 你说我听杂谈 | 来源:发表于2020-04-17 17:40 被阅读0次

    一.Sentinel 是什么
    二.Sentinel 的历史
    三.Sentinel 基本概念
    3.1.资源
    3.2.规则
    四.Sentinel 功能和设计理念
    4.1.流量控制
    4.1.1.什么是流量控制
    4.1.2.流量控制设计理念
    4.2.熔断降级
    4.2.1.什么是熔断降级
    4.2.2.熔断降级设计理念
    4.3.系统负载保护
    五.Sentinel 是如何工作的
    六.实战演练
    6.1.maven导入
    6.2.application.properties配置
    6.3.SpringBoot启动类
    6.4.SentinelTest测试类
    6.5.启动Sentinel及页面展示
    6.6.启动springBoot测试类
    6.7.postman启动测试
    6.8.再次进入Sentinel控制台
    6.9.test接口限流
    6.10.流控配置
    6.11.实时监控

    一、Sentinel 是什么

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 是面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。

    二、Sentinel 的历史

    • 2012 年, Sentinel 诞生,主要功能为入口流量控制。

    • 2013-2017 年, Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。 Sentinel 也因此积累了大量的流量归整场景以及生产实践。

    • 2018 年, Sentinel 开源。

    三、Sentinel 基本概念

    3.1.资源

    资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

    只要通过 SentinelAPI 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

    3.2.规则

    围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整

    四、Sentinel 功能和设计理念

    4.1.流量控制

    4.1.1.什么是流量控制

    流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:


    适配器

    4.1.2.流量控制设计理念

    流量控制有以下几个角度:

    • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;

    • 运行指标,例如 QPS、线程池、系统负载等;

    • 控制的效果,例如直接限流、冷启动、排队等。

    Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

    4.2.熔断降级

    4.2.1.什么是熔断降级

    除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和 Hystrix里面描述的问题是一样的。

    Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。

    4.2.2.熔断降级设计理念

    在限制的手段上, Sentinel 和 Hystrix 采取了完全不一样的方法。

    Hystrix 通过线程池的方式,来对依赖(在我们的概念中对应资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。

    Sentinel 对这个问题采取了两种手段:

    1. 通过并发线程数进行限制和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
    2. 通过响应时间对资源进行降级除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

    4.3.系统负载保护

    Sentinel 同时对系统的维度提供保护。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。

    针对这个情况, Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

    五、Sentinel 是如何工作的

    Sentinel 的主要工作机制如下:

    • 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。

    • 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时, Sentinel 提供开放的接口,方便您定义及改变规则。

    • Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。

    六、实战演练

    6.1.maven导入

    相关 jar包:

    1. spring-boot-starter-web
    2. spring-cloud-starter-alibaba-sentinel
    3. spring-boot-starter-parent
    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.5.RELEASE</version>
            <relativePath/>
        </parent>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.2</version>
                <optional>true</optional>
            </dependency>
    
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
            <dependency>
                 <groupId> org.springframework.boot </groupId>
                 <artifactId>spring-boot-starter-test</artifactId>
                 <scope>test </scope>
            </dependency>
        </dependencies>
    
    

    6.2.application.properties配置

    spring.application.name = SentinelTest
    server.port = 10021
    spring.cloud.sentinel.transport.dashboard = localhost : 8080
    

    6.3.SpringBoot启动类

    @SpringBootApplication
    public class SpringcloudsentineltestApplication {
        public static void main (String[] args) {
            SpringApplication.run(SpringcloudsentineltestApplication.class, args);
            }
    }
    

    6.4.SentinelTest测试类

    @RestController
    @Slf4j
    public class SentinelTest {
        @GetMapping("/test")
        public String test() {
            return "OK";
         }
    }
    

    6.5.启动及页面展示

    下载 sentinel-dashboard-1.4.0.jar到本地以后,双击启动即可,在浏览器输入 http://localhost:8080,见到如下图即可表示启动成功。

    首页面

    6.6.启动springBoot测试类

    按下图操作,点击启动按钮即可


    启动测试类

    6.7.postman启动测试

    在postman页面输入 http://localhost:10021/test,进行测试即可,收到 OK,表示测试成功

    postman测试页面

    6.8.再次进入Sentinel控制台

    进入sentinel控制台,刷新控制台,会见到如下页面:


    sentinelTest

    6.9.test接口限流

    点击 簇点链路,会见到如下页面

    簇点链路

    6.10.流控配置

    点击页面中的流控按钮,则弹出配置页面,测试配置的单机阈值,如下图

    配置的单机阈值

    6.11.实时监控

    回到postman,多次快速请求接口,再次回到 Sentinel,查看实时监控, QPS最高是3,剩下的请求都会被限制住,如图所示


    实时监控

    参考资料:https://github.com/alibaba/Sentinel/wiki/主页

    相关文章

      网友评论

        本文标题:Alibaba限流组件Sentinel

        本文链接:https://www.haomeiwen.com/subject/lmryvhtx.html