精华内容
下载资源
问答
  • sentinel

    千次阅读 2020-03-02 21:03:35
    Sentinel

     https://github.com/alibaba/sentinel


    1 Docker部署sentinel

    1.1 搜索镜像

    https://hub.docker.com/r/bladex/sentinel-dashboard/tags 

    docker search sentinel
    

    1.2 拉取镜像 

    docker pull bladex/sentinel-dashboard:1.6.3

    1.3 启动sentinel

    docker run -d --name sentinel -p 8858:8858 bladex/sentinel-dashboard:1.6.3
    

    1.4 web界面访问

    http://ip:8858

    登录名/密码 默认是sentinel


    2 使用docker-compose构建 

    2.1 拉取官方jar包

    https://github.com/alibaba/sentinel/releases

    wget https://github.com/alibaba/Sentinel/releases/download/1.6.3/sentinel-dashboard-1.6.3.jar
    [root@yuanyu /]# mkdir -p /usr/local/server/sentinel && cd /usr/local/server/sentinel
    version: "3"
    services:
      gourd-hu-service:
        container_name: sentinel
        restart: always
        image: java:8
        volumes:
          - /usr/local/server/sentinel/sentinel-dashboard-1.6.3.jar:/sentinel-dashboard-1.6.3.jar
          - /etc/localtime:/etc/localtime
        ports:
          - "8858:8858"
        environment:
          - TZ="Asia/Shanghai"
        entrypoint: java -jar sentinel-dashboard-1.6.3.jar  --server.port=8858
    [root@yuanyu sentinel]#  docker-compose up -d

    https://blog.csdn.net/HXNLYW/article/details/104613163

     

    展开全文
  • Sentinel

    千次阅读 2021-03-27 08:10:23
    一、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 —句话解释,之前我们讲解过的Hystrix。...

    一、Sentinel是什么

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
    —句话解释,之前我们讲解过的Hystrix。

    二、Sentinel 具有以下特征

    • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
    • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500台以下规模的集群的汇总运行情况。
    • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
    • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

    三、Hystrix与Sentinel比较

    • Hystrix
      (1)需要我们程序员自己手工搭建监控平台
      (2)没有一套web界面可以给我们进行更加细粒度化得配置流控、速率控制、服务熔断、服务降级
    • Sentinel
      (1)单独一个组件,可以独立出来。
      (2)直接界面化的细粒度统一配置。

    四、Sentinel下载安装运行

    (1)下载

    • https://github.com/alibaba/Sentinel/releases
    • 下载到本地sentinel-dashboard-1.7.0.jar

    (2)运行命令

    • 前提:Java 8 环境、8080端口不能被占用
    • 命令:java -jar sentinel-dashboard-1.7.0.jar

    (3)访问Sentinel管理界面

    • localhost:8080
    • 登录账号密码均为sentinel

    (4)Sentinel 分为两个部分:

    • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud等框架也有较好的支持。
    • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

    五、Sentinel初始化监控

    (1)启动Nacos8848成功
    (2)新建工程 - cloudalibaba-sentinel-service8401,并引入下面依赖

     <dependencies>
            <!--SpringCloud ailibaba nacos -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
            </dependency>
            <!--SpringCloud ailibaba sentinel -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
            <!--openfeign-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <!-- SpringBoot整合Web组件+actuator -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
     </dependencies>
    <dependencyManagement>
            <dependencies>
                <!--spring cloud alibaba 2.1.0.RELEASE-->
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>2.1.0.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
     </dependencyManagement>
    

    (3)YML

    server:
      port: 8401
    
    spring:
      application:
        name: cloudalibaba-sentinel-service
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #Nacos服务注册中心地址
        sentinel:
          transport:
            dashboard: localhost:8080 #配置Sentinel dashboard地址
            port: 8719
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    
    feign:
      sentinel:
        enabled: true # 激活Sentinel对Feign的支持
    

    (4)主启动

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @EnableDiscoveryClient
    @SpringBootApplication
    public class MainApp8401 {
        public static void main(String[] args) {
            SpringApplication.run(MainApp8401.class, args);
        }
    }
    

    (5)业务类FlowLimitController

    import com.alibaba.csp.sentinel.annotation.SentinelResource;
    import com.alibaba.csp.sentinel.slots.block.BlockException;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.concurrent.TimeUnit;
    
    @RestController
    @Slf4j
    public class FlowLimitController {
        @GetMapping("/testA")
        public String testA()
        {
            return "------testA";
        }
    
        @GetMapping("/testB")
        public String testB()
        {
            log.info(Thread.currentThread().getName()+"\t"+"...testB");
            return "------testB";
        }
    }
    

    (6)测试

    • 启动Sentinel8080
      java -jar sentinel-dashboard-1.7.0.jar
    
    • 启动微服务8401
    • 启动8401微服务后查看sentienl控制台
      刚启动,空空如也,什么都没有
      在这里插入图片描述
    • 原因:Sentinel采用的懒加载
      执行一次访问即可
      http://localhost:8401/testA
      http://localhost:8401/testB
    • 效果:sentinel8080正在监控微服务8401
      在这里插入图片描述

    六、Sentinel流控规则简介

    基本介绍:
    在这里插入图片描述
    进一步解释说明:
    (1)资源名:唯一名称,默认请求路径。
    (2)针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
    (3)阈值类型/单机阈值:

    • QPS(每秒钟的请求数量)︰当调用该API的QPS达到阈值的时候,进行限流。
    • 线程数:当调用该API的线程数达到阈值的时候,进行限流。

    (4)是否集群:不需要集群。
    (5)流控模式:

    • 直接:API达到限流条件时,直接限流。
    • 关联:当关联的资源达到阈值时,就限流自己。
    • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【API级别的针对来源】。

    (6)流控效果:

    • 快速失败:直接失败,抛异常。
    • Warm up:根据Code Factor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
    • 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。

    七、Sentinel流控-QPS直接失败

    (1)直接 -> 快速失败(系统默认)
    (2)配置及说明
    表示1秒钟内查询1次就是OK,若超过次数1,就直接->快速失败,报默认错误
    在这里插入图片描述
    (3)测试
    快速多次点击访问http://localhost:8401/testA
    (4)结果
    返回页面 Blocked by Sentinel (flow limiting)
    思考:
    直接调用默认报错信息,技术方面OK,但是,是否应该有我们自己的后续处理?类似有个fallback的兜底方法?

    八、Sentinel流控-线程数直接失败

    线程数:当调用该API的线程数达到阈值的时候,进行限流。
    在这里插入图片描述

    九、Sentinel流控-关联

    (1)是什么?

    • 当自己关联的资源达到阈值时,就限流自己
    • 当与A关联的资源B达到阀值后,就限流A自己(B惹事,A挂了)

    (2)设置testA
    当关联资源/testB的QPS阀值超过1时,就限流/testA的Rest访问地址,当关联资源到阈值后限制配置好的资源名。
    在这里插入图片描述
    (3)Postman模拟并发密集访问testB
    在这里插入图片描述
    (4)访问testB成功
    在这里插入图片描述
    (5)postman里新建多线程集合组
    在这里插入图片描述
    (6)将访问地址添加进新新线程组
    在这里插入图片描述
    (7)Run - 大批量线程高并发访问B
    Postman运行后,点击访问http://localhost:8401/testA,发现testA挂了
    结果Blocked by Sentinel(flow limiting)

    十、Sentinel流控-预热

    (1)Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。详细文档可以参考 流量控制 - Warm Up 文档,具体的例子可以参见 WarmUpFlowDemo。
    通常冷启动的过程系统允许通过的 QPS 曲线如下图所示:
    在这里插入图片描述
    默认coldFactor为3,即请求QPS 从 threshold / 3开始,经预热时长逐渐升至设定的QPS阈值
    (2)WarmUp配置
    案例,阀值为10+预热时长设置5秒。
    系统初始化的阀值为10/ 3约等于3,即阀值刚开始为3;然后过了5秒后阀值才慢慢升高恢复到10
    在这里插入图片描述
    (3)测试
    多次快速点击http://localhost:8401/testB - 刚开始不行,后续慢慢OK
    (4)应用场景
    如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阀值增长到设置的阀值。

    十一、Sentinel流控-排队等待

    匀速排队,让请求以均匀的速度通过,阀值类型必须设成QPS,否则无效。
    (1)设置:/testA每秒1次请求,超过的话就排队等待,等待的超时时间为20000毫秒。
    在这里插入图片描述
    (2)匀速排队
    匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。详细文档可以参考 流量控制 - 匀速器模式,具体的例子可以参见 PaceFlowDemo。
    该方式的作用如下图所示:
    在这里插入图片描述
    这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
    注意:匀速排队模式暂时不支持 QPS > 1000 的场景。
    (3)测试:
    添加日志记录代码到FlowLimitController的testA方法

    @RestController
    @Slf4j
    public class FlowLimitController {
        @GetMapping("/testA")
        public String testA()
        {
            log.info(Thread.currentThread().getName()+"\t"+"...testA");//<----
            return "------testA";
        }
        ...
    }
    

    (4)Postman模拟并发密集访问testA。具体操作参考117_Sentinel流控-关联
    后台结果:
    在这里插入图片描述

    十二、Sentinel降级简介

    (1)熔断降级概述
    除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
    现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
    (2)
    在这里插入图片描述

    • RT(平均响应时间,秒级)
      • 平均响应时间 超出阈值 且 在时间窗口内通过的请求>=5,两个条件同时满足后触发降级。
      • 窗口期过后关闭断路器。
      • RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)。
    • 异常比列(秒级)
      • QPS >= 5且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级 。
    • 异常数(分钟级)
      • 异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

    (3)Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
    当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
    Sentinei的断路器是没有类似Hystrix半开状态的。(Sentinei 1.8.0 已有半开状态)
    半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。

    十三、Sentinel降级-RT

    (1)是什么?
    平均响应时间(DEGRADE_GRADE_RT):当1s内持续进入5个请求,对应时刻的平均响应时间(秒级)均超过阈值( count,以ms为单位),那么在接下的时间窗口(DegradeRule中的timeWindow,以s为单位)之内,对这个方法的调用都会自动地熔断(抛出DegradeException )。注意Sentinel 默认统计的RT上限是4900 ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置。
    注意:Sentinel 1.7.0才有平均响应时间(DEGRADE_GRADE_RT),Sentinel 1.8.0的没有这项,取而代之的是慢调用比例 (SLOW_REQUEST_RATIO)。
    (2)慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断
    (3)测试
    代码

    @RestController
    @Slf4j
    public class FlowLimitController {
    	...
    
        @GetMapping("/testD")
        public String testD() {
            try { 
                TimeUnit.SECONDS.sleep(1); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            }
            log.info("testD 测试RT");
        }
    }
    

    (4)配置
    在这里插入图片描述
    (5)jmeter压测
    在这里插入图片描述
    (6)结论
    按照上述配置,永远一秒钟打进来10个线程(大于5个了)调用testD,我们希望200毫秒处理完本次任务,如果超过200毫秒还没处理完,在未来1秒钟的时间窗口内,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了后续我停止jmeter,没有这么大的访问量了,断路器关闭(保险丝恢复),微服务恢复OK。

    展开全文
  • Sentinel:分布式系统的流量防卫兵 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: ...

    前言:
    Sentinel:分布式系统的流量防卫兵

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

    Sentinel 具有以下特征:

    丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
    完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
    广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
    完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
    Sentinel 分为两个部分:

    核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
    控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
    重点来 他是一个jar包,所以就操作比较简单 Java -jar…就可以,操作简单
    这些Sentinel给的介绍,官网地址:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
    他和第一版 cloud的SpringCloud-Hystrix熔断器服务降级做对比的话 首先不从代码上讲,SpringCloud-Hystrix的监控需要单独一个符才可以做,而Sentinel他一单独的一个项目运行的,在代码上也简化了不少了 我为什么这么说呢,因为Sentinel都是可视化配置配合注解 完成,服务降级,限流等
    想用Sentinel首相可定去官网下载Sentinel的jar包
    下载地址:https://github.com/alibaba/Sentinel/releases/tag/v1.8.0
    这最新的版本
    在这里插入图片描述
    这都不用说说了把拉倒底点击下载
    在这里插入图片描述
    在这里插入图片描述

    运行Sentinel

    前提 jdk 1.8
    端口是:8080 检查一下8080端口是否被占用 被占用起不来
    从目下打开cmd窗口

    Java -jar sentinel-dashboard-1.8.0.jar
    

    在这里插入图片描述

    启动成功访问Sentinel界面
    账号:sentinel
    密码:sentinel
    在这里插入图片描述
    登陆成功:
    在这里插入图片描述
    现在启动完成 ,结合项目使用

    案例:
    pom:
    两个依赖 一个是sentinel 做持久化的 就是数据库 一个是sentinel

      <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
            </dependency>
            <!--SpringCloud ailibaba sentinel -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
    

    yml
    port: 8719 如果端口被占用 就从8719+1开始 一直找到那个端口没被占用为止

    server:
      port: 8092
    spring:
      application:
        name: cloudalibaba-sentinel-service
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #Nacos服务注册中心地址
        sentinel:
          transport:
            dashboard: localhost:8080 #配置Sentinel dashboard地址
            port: 8719
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    
    
    
    

    启动类:

    package com.tang.cloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class SentinelService8092 {
    
        public static void main(String[] args) {
            SpringApplication.run(SentinelService8092.class,args);
        }
    }
    
    

    测试类写个方法就可以
    Sentinel是 懒加载机制所以呢 需要访问一下接口即可
    再去访问Sentinel 就有数据了
    在这里插入图片描述

    在这里插入图片描述
    Sentinel流控监测
    资源名:唯一名称请求路径

    针对来源:Sentinel可以针对调用者进行限流,填写微服务的名 默认default(不区分来源)
    阀值类型/单机阀值:QPS(每秒请求的数量)当前调用api的QPS达到阀值的 时候进行限流
    进程数当调用该api的线程达到了阀值的时候限流

    流控模式:
    直接:是 api达到了限流的条件时直接限流
    关联:当关联的资源达到阀值的时候就限流自己
    链路:只记录指定链路的流量
    流控效果:
    快速失败:直接抛异常
    wan Up:根据codeFactor(冷加载因子默认3)的值 从阀值/codeFactor,进过预热时长才打到设置的QPS阀值

    排队等待:均速排队,让请求以均速通过,阀值类型必须是QPS否则无效

    在这里插入图片描述

    在这里插入图片描述
    来测试一下 QPS
    在这里插入图片描述

    QPS单机阀值是1代表的是一秒一次

    如果点的过快的话直接抛异常
    在这里插入图片描述

    线程的阀值是·1的话 值允许一个线程进去如果在进一个就会抛异常、
    Blocked by Sentinel (flow limiting)
    在这里插入图片描述
    关联
    QPS阀值是1 意思是 当/select/test1访问达到了阀值 /select/test的这个接口就会被限流
    在这里插入图片描述
    根据调用链路入口限流:链路限流
    NodeSelectorSlot 中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为 machine-root 的虚拟节点,调用链的入口都是这个虚节点的子节点。

    一棵典型的调用树如下图所示:

     	          machine-root
                    /       \
                   /         \
             Entrance1     Entrance2
                /             \
               /               \
      DefaultNode(nodeA)   DefaultNode(nodeA)
    

    上图中来自入口 Entrance1 和 Entrance2 的请求都调用到了资源 NodeA,Sentinel 允许只根据某个入口的统计信息对资源限流。比如我们可以设置 strategy 为 RuleConstant.STRATEGY_CHAIN,同时设置 refResource 为 Entrance1 来表示只有从入口 Entrance1 的调用才会记录到 NodeA 的限流统计当中,而不关心经 Entrance2 到来的调用。

    调用链的入口(上下文)是通过 API 方法 ContextUtil.enter(contextName) 定义的,其中 contextName 即对应调用链路入口名称。详情可以参考 ContextUtil 文档。

    3.3 具有关系的资源流量控制:关联流量控制
    当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。

    Warm Up:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处理低水平的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加在这里插入图片描述
    到阈值的上限,给系统一个预热的时间,避免冷系统被压垮

    意思WarmUp吗,默认是3阀值预热时间超过10秒才能到达我能的我的想要的效果一秒10个请求
    在这里插入图片描述
    匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。详细文档可以参考 流量控制 - 匀速器模式,具体的例子可以参见 PaceFlowDemo。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Sentinel(一)】Sentinel介绍与使用

    万次阅读 多人点赞 2019-11-30 20:56:23
    一、什么是Sentinel Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 官网:https://github.com/alibaba/Sentinel/wiki Sentinel主要特性: Sentinel与...

    一、什么是Sentinel

    Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。

    官网:https://github.com/alibaba/Sentinel/wiki

    Sentinel主要特性:
    在这里插入图片描述

    Sentinel与Hystrix的区别

    关于Sentinel与Hystrix的区别见:https://yq.aliyun.com/articles/633786/

    总体来说:

    Hystrix常用的线程池隔离会造成线程上下切换的overhead比较大;Hystrix使用的信号量隔离对某个资源调用的并发数进行控制,效果不错,但是无法对慢调用进行自动降级;Sentinel通过并发线程数的流量控制提供信号量隔离的功能;

    此外,Sentinel支持的熔断降级维度更多,可对多种指标进行流控、熔断,且提供了实时监控和控制面板,功能更为强大。

    二、代码示例

    下面跟随官网中提供的Quick Start Demo,去看看如何使用Sentinel实现限流和降级。
    本文代码见:github代码

    注意:

    • JDK >= 1.7;
    • Sentinel版本为1.7.0;

    引入Sentinel jar包:

    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-core</artifactId>
        <version>1.7.0</version>
    </dependency>
    

    1、限流

    关于限流的使用和介绍见:Sentinel流量控制

    流量控制(Flow Control),原理是监控应用流量的QPS或并发线程数等指标,当达到指定阈值时对流量进行控制,避免系统被瞬时的流量高峰冲垮,保障应用高可用性。

    下面写个简单的示例,看看如何使用Sentinel实现限流。

    首先写个简单的订单查询接口,用于后续接口限流示例:

    @Component
    public class OrderQueryService {
    
        public String queryOrderInfo(String orderId) {
            System.out.println("获取订单信息:" + orderId);
            return "return OrderInfo :" + orderId;
        }
    }
    
    @Controller
    @RequestMapping("order")
    public class OrderController {
        @Autowired
        private OrderQueryService orderQueryService;
    
        @RequestMapping("/getOrder")
        @ResponseBody
        public String queryOrder1(@RequestParam("orderId") String orderId) {
    
            return orderQueryService.queryOrderInfo(orderId);
        }
    }
    

    正常情况下,调用OrderController中订单查询接口,会返回订单信息,如何控制接口访问的QPS在2以下呢?Sentienl限流提供了以下实现方式:

    Sentienl如何使用

    首先需要定义限流规则,比如对哪个接口进行限流,限制的QPS为多少,限制调用方app是什么等:

    public void initFlowQpsRule() {
            List<FlowRule> rules = new ArrayList<FlowRule>();
            FlowRule rule1 = new FlowRule();
            rule1.setResource(KEY);
            // QPS控制在2以内
            rule1.setCount(2);
            // QPS限流
            rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
            rule1.setLimitApp("default");
            rules.add(rule1);
            FlowRuleManager.loadRules(rules);
        }
    

    限流实现方式有多种,本文只列出常见两种:

    (1)限流实现方式一: 抛出异常的方式定义资源

    此方式对代码侵入性较高,需要在接口调用的地方通过try-catch风格的API对代码进行包装:

    		/**
         * 限流实现方式一: 抛出异常的方式定义资源
         *
         * @param orderId
         * @return
         */
    		@RequestMapping("/getOrder1")
        @ResponseBody
        public String queryOrder2(@RequestParam("orderId") String orderId) {
    
            Entry entry = null;
            // 资源名
            String resourceName = KEY;
            try {
                // entry可以理解成入口登记
                entry = SphU.entry(resourceName);
                // 被保护的逻辑, 这里为订单查询接口
                return orderQueryService.queryOrderInfo(orderId);
            } catch (BlockException blockException) {
                // 接口被限流的时候, 会进入到这里
                log.warn("---getOrder1接口被限流了---, exception: ", blockException);
                return "接口限流, 返回空";
            } finally {
                // SphU.entry(xxx) 需要与 entry.exit() 成对出现,否则会导致调用链记录异常
                if (entry != null) {
                    entry.exit();
                }
            }
    
        }
    

    测试,当QPS > 2时,接口返回:

    查看日志输出:

    在这里插入图片描述

    这里注意到,Sentinel默认的日志输出文件位置为:/{userhome}/logs/csp/

    当接口发生限流的时候,我们看下Sentinel输出了什么日志:

    日志格式为:时间戳 | 该秒发生的第一个资源 | 资源名称,拦截的原因,接口调用来源,|被拦截资源的调用者,被拦截的数量

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWZtliaM-1575117332202)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191124103313950.png)]

    关于日志的描述,见 Sentienl 日志

    (2)限流实现方式二: 注解方式定义资源

    上述通过try-catch风格的API可以实现限流,但是对代码侵入性太高,推荐使用注解的方式来实现。下文若不做注明,默认都会采用注解的方式实现。

    关于注解的使用见:Sentinel注解使用

    首先需要引入支持注解的jar包:

    <dependency>
         <groupId>com.alibaba.csp</groupId>
         <artifactId>sentinel-annotation-aspectj</artifactId>
         <version>${sentinel.version}</version>
    </dependency>
    

    Sentinel切面类配置:

    @Configuration
    public class SentinelAspectConfiguration {
    
        @Bean
        public SentinelResourceAspect sentinelResourceAspect() {
            return new SentinelResourceAspect();
        }
    }
    

    在接口OrderQueryService中,使用注解实现订单查询接口的限流:

        /**
         * 订单查询接口, 使用Sentinel注解实现限流
         *
         * @param orderId
         * @return
         */
        @SentinelResource(value = "getOrderInfo", blockHandler = "handleFlowQpsException",
                fallback = "queryOrderInfo2Fallback")
        public String queryOrderInfo2(String orderId) {
    
            // 模拟接口运行时抛出代码异常
            if ("000".equals(orderId)) {
                throw new RuntimeException();
            }
    
            System.out.println("获取订单信息:" + orderId);
            return "return OrderInfo :" + orderId;
        }
    
        /**
         * 订单查询接口抛出限流或降级时的处理逻辑
         *
         * 注意: 方法参数、返回值要与原函数保持一致
         * @return
         */
        public String handleFlowQpsException(String orderId, BlockException e) {
            e.printStackTrace();
            return "handleFlowQpsException for queryOrderInfo2: " + orderId;
        }
    
        /**
         * 订单查询接口运行时抛出的异常提供fallback处理
         *
         * 注意: 方法参数、返回值要与原函数保持一致
         * @return
         */
        public String queryOrderInfo2Fallback(String orderId, Throwable e) {
            return "fallback queryOrderInfo2: " + orderId;
        }
    
    • blockHandler = "handleFlowQpsException"用来处理Sentinel 限流/熔断等错误;
    • fallback = "queryOrderInfo2Fallback"用来处理接口中业务代码所有异常(如业务代码异常、sentinel限流熔断异常等);

    注:以上两种处理方法中方法名、参数都需与受保护的函数保持一致。

    测试:

    		/**
         * 限流实现方式二: 注解定义资源
         *
         * @param orderId
         * @return
         */
        @RequestMapping("/getOrder2")
        @ResponseBody
        public String queryOrder3(@RequestParam("orderId") String orderId) {
            return orderQueryService.queryOrderInfo2(orderId);
        }
    

    测试结果在这里就不贴出来了,结果类似。

    2、熔断降级

    除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。

    由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

    关于熔断降级的介绍见:Sentinel熔断降级

    下面就使用基于注解的方式实现Sentinel的熔断降级的demo。

    @Component
    @Slf4j
    public class GoodsQueryService {
    
        private static final String KEY = "queryGoodsInfo2";
    
        /**
         * 模拟商品查询接口
         *
         * @param spuId
         * @return
         */
        @SentinelResource(value = KEY, blockHandler = "blockHandlerMethod", fallback = "queryGoodsInfoFallback")
        public String queryGoodsInfo(String spuId) {
    
            // 模拟调用服务出现异常
            if ("0".equals(spuId)) {
                throw new RuntimeException();
            }
    
            return "query goodsinfo success, " + spuId;
        }
    
        public String blockHandlerMethod(String spuId, BlockException e) {
            log.warn("queryGoodsInfo222 blockHandler", e.toString());
            return "queryGoodsInfo error, blockHandlerMethod res: " + spuId;
    
        }
    
        public String queryGoodsInfoFallback(String spuId, Throwable e) {
            log.warn("queryGoodsInfo222 fallback", e.toString());
            return "queryGoodsInfo error, return fallback res: " + spuId;
        }
    
        @PostConstruct
        public void initDegradeRule() {
            List<DegradeRule> rules = new ArrayList<>();
            DegradeRule rule = new DegradeRule();
            rule.setResource(KEY);
            // 80s内调用接口出现异常次数超过5的时候, 进行熔断
            rule.setCount(5);
            rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
            rule.setTimeWindow(80);
            rules.add(rule);
            DegradeRuleManager.loadRules(rules);
        }
    }
    
    
    // 测试类
    @Controller
    @RequestMapping("goods")
    public class GoodsController {
    
        @Autowired
        private GoodsQueryService goodsQueryService;
    
        @RequestMapping("/queryGoodsInfo")
        @ResponseBody
        public String queryGoodsInfo(@RequestParam("spuId") String spuId) {
            String res = goodsQueryService.queryGoodsInfo(spuId);
            return res;
        }
    }
    

    三、控制台的使用

    Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。

    主要功能有:

    • 查看机器列表以及健康情况;
    • 监控;
    • 规则管理和推送;
    • 鉴权;

    1、启动Sentinel控制台

    如何启动控制台见:启动控制台

    启动方式:

    (1)下载jar包,通过命令方式

    在https://github.com/alibaba/Sentinel/releases下载对应版本的dashboard jar包,进入到该jar所在的目录,然后通过java命令运行该jar包即可:

    java -Dserver.port=8080 \
    -Dcsp.sentinel.dashboard.server=localhost:8080 \
    -jar target/sentinel-dashboard.jar
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHMUeLiz-1575117332203)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191130195303037.png)]

    (2)git clone 整个sentinel源码,进入sentinel-dashboard模块,执行打包命令:mvn clean package,生成一个可执行的 fat jar包,然后启动控制台,输入url:localhost:8080后即可进入主页面。

    2、客户端接入(Spring Boot项目接入控制台)

    启动了控制台模块后,控制台页面都是空的,需要接入客户端。

    (1)首先导入与控制台通信的jar包:

    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-transport-simple-http</artifactId>
        <version>${sentinel.version}</version>
    </dependency>
    

    (2)配置 JVM 启动参数:

    -Dproject.name=sentinel-demo -Dcsp.sentinel.dashboard.server=127.0.0.1:8080 -Dcsp.sentinel.api.port=8719

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxjzpbyT-1575117332204)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191130192128302.png)]

    启动应用。

    注:在应用中需要有触发限流、降级的初始化代码。

    本demo中http://localhost:8083/order/getOrder1?orderId=123接口执行多次,会触发限流操作,这时候再去看控制台:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZvaNKw7-1575117332204)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191130195613860.png)]

    可以看到,getOrderInfo接口被限流的次数。

    4、控制台的使用

    如果我们想使用Sentinel的限流和熔断功能,除了在代码中可以硬编码外,也可直接通过控制台进行粗略的对接口进行限流和熔断。

    /**
         * 代码不加任何限流 熔断
         * @return
         */
        @RequestMapping("/test")
        @ResponseBody
        @SentinelResource("test")
        public String test() {
            return "test";
        }
    

    执行http://localhost:8083/goods/test接口动作后,在页面上簇点链路中即可看到该接口已经被统计到:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kc56Vgu1-1575117332207)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191130201216117.png)]

    点击流控,对该接口新增一条流控规则,配置如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zMK2mbJt-1575117332208)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191130201312578.png)]

    点击新增后,

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BxQdvVMd-1575117332209)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191130201331799.png)]

    再去执行接口http://localhost:8083/goods/test,当QPS超过2时,即可看到接口返回异常,达到流控效果。

    当然,控制台流控规则、降级规则的使用还有很多,可以参考官方文档看看具体如何使用。


    PS

    在接入控制台过程中,发现控制台一直会报error:

    2019-11-30 20:42:23.338 ERROR 5317 --- [pool-2-thread-1] c.a.c.s.dashboard.metric.MetricFetcher   : Failed to fetch metric from <http://10.200.183.30:8721/metric?startTime=1575117735000&endTime=1575117741000&refetch=false> (ConnectionException: Connection refused)
    
    

    错误原因是控制台在收集客户端数据时,从IP地址http://10.200.183.30:8721连接不上;

    后发现原来开启了代理,关闭代理后就正常。


    参考:

    官方文档:https://github.com/alibaba/Sentinel/wiki

    参考博客:https://www.jianshu.com/p/c47dfd25eeee
    本文代码:https://github.com/nomico271/sentinel-demo/tree/master/Ch1_SentinelDemo

    展开全文
  • Spring Cloud Alibaba 03_使用 Sentinel 实现服务限流降级熔断 雪崩效应 当服务A不可用时,服务B调用服务A的所有线程将处于阻塞状态,在高并发情况下,服务B中阻塞的线程越来越多,导致内存空间不足,致使服务B崩溃...
  • 哨兵2号(Sentinel-2)介绍、下载、预处理及批处理

    万次阅读 多人点赞 2019-04-17 13:57:02
    (如何没有一些加速手段,就早上9点之前下载,速度很快) 2019/12/23/更新: 关于Sentinel数据写的很不错的博文: 超级禾欠水CSND博客——03-SNAP处理Sentinel-2 L2A级数据(博主创建的欧空局SNAP处理交流QQ群:...
  • docker运行阿里巴巴Sentinel

    万次阅读 2020-10-22 14:17:06
    docker run --name sentinel-dashboard -p 8080:8080 -e port=8080 -e server=localhost:8080 -e name=sentinel-dashboard -e username=sentinel -e password=sentinel -v /opt/sentinel/logs:/root/logs/csp/ -d ...
  • sentinel-demo:Sentinel学习案例:Sentinel仪表板接收,与SpringCloud进行整合
  • springboot整合Sentinel

    2021-02-21 13:48:37
    springboot整合Sentinel
  • redis sentinel

    2021-03-03 11:39:28
    redis sentinel redis sentinel节点: 监控 多个 高可用 公平 不执行存储 可以执行ping sentinel彼此能够感知 客户端从sentinel获取redis信息 sentinel知道主从节点信息 故障转移: 自动完成 多个sentinel确认master...
  • redis-sentinel 基于 phpredis 扩展的 redis-sentinel 客户端
  • 启动sentinel

    2020-05-20 23:19:29
    windows 启动sentinel java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 -jar E:\zkkafk a\sentinel-dashboard-1.6.2.jar
  • Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 ...
  • redis Sentinel

    2019-09-05 23:26:51
    启动一个Sentinel $ redis-sentinel /path/to/your/sentinel.conf 或者 $ redis-server /path/to/your/sentinel.conf --sentinel
  • Sentinel入门

    2020-05-28 11:51:29
    Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 的历史 2012 年,Sentinel ...
  • 阿里巴巴出品的降级限流组件,先将zip格式文件解压,然后直接java -jar sentinel-1.6.3.jar,即可启动。截止到2019年11月的最新版本。
  • Sentinel 控制台

    千次阅读 2020-09-05 17:17:24
    Sentinel 控制台 1. 概述 Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。另外,鉴权在生产环境中也必不可少。这里,我们将会详细讲述如何通过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,909
精华内容 9,563
热门标签
关键字:

sentinel