zoukankan      html  css  js  c++  java
  • Sentinel

    Sentinel

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

    Sentinel主要特征

    image-20201104164131280

    Sentinel安装运行

    Sen分为两个部分:

    • 核心库(java客户端)不依赖任何框架,能够运行所有java运行时环境,同时对Dubbo/SpringCloud等框架也有较好的支持。
    • 控制台(Dashboard)基于Springboot开发,不需要额外的Tomcat等应用容器。

    下载Sentinel:https://github.com/alibaba/Sentinel/releases/tag/1.7.0

    运行命令

    java -jar sentinel-dashboard-1.7.0.jar
    

    image-20201104171127300

    在浏览器中运行localhost:8080

    用户名和密码是:sentinel

    image-20201104171251194

    运行成功

    Sentinel初始化监控

    创建子项目(cloudalibaba-sentinel-service8401)

    pom.xml

     <dependencies>
            <dependency>
                <groupId>com.atguigu.springcloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </dependency>
            <!--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>
            <!--日常通用jar包配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>4.6.3</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    

    创建配置文件application.yml

    server:
      port: 8401
    
    spring:
      application:
        name: cloudalibaba-sentinel-service
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
        sentinel:
          transport:
            dashboard: localhost:8080       #配置Sentinel dashboard地址
            port: 8719      #默认8719端口,如果被占用会自动从8719开始依次+1,直到找到未被占用的端口
                            #8719端口是应用和Sentinel控制台交互的端口
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    

    创建主启动类MainApp8401

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

    创建业务类FlowLimitController

    @RestController
    @RefreshScope
    public class FlowLimitController {
        @GetMapping("/testA")
        public String testA() {
            return "***************testA*****************";
        }
        @GetMapping("/testB")
        public String testB() {
            return "***************testB*****************";
        }
    }
    

    运行

    image-20201105103259096

    image-20201105103318304

    Sentinel流控规则简介

    image-20201105103639372

    • 资源名:唯一名称,默认请求路径
    • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
    • 阈值类型/单机阈值:
      • QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流
      • 线程数:当调用该api的线程数达到阈值的时候,进行限流
    • 是否集群:不需要集群
    • 流控模式:
      • 直接:api达到限流条件时,直接限流
      • 关联:当关联的资源达到阈值时,就限流自己
      • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)[api级别的针对来源]
    • 流控效果:
      • 快速失败:直接失败,抛异常
      • Warm Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
      • 排队等待匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

    Sentinel流控-QPS直接失败

    在此页面

    image-20201105105308528

    新增流控规则

    image-20201105105355051

    表示1s内查询一次就是正常,若超过一次,就直接快速失败,报默认错误

    image-20201105105538798

    Sentinel流控-线程数直接失败

    新增流控规则

    image-20201105110146379

    模拟线程休息时间FlowLimitController

    @RestController
    @RefreshScope
    public class FlowLimitController {
        @GetMapping("/testA")
        public String testA() {
            try {
                TimeUnit.MILLISECONDS.sleep(800);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "***************testA*****************";
        }
        @GetMapping("/testB")
        public String testB() {
            return "***************testB*****************";
        }
    }
    

    image-20201105110624959

    当两个同时多次访问的时候就会报异常。

    Sentinel流控-关联

    当关联的资源达到阈值是,就限流自己。

    当与A关联的资源B达到阈值后,A就会限流

    image-20201105124641789

    当关联资源/testB的qps阈值超过1时,就限流/testA的Rest访问地址,当关联资源到阈值后限制配置好的资源名。

    image-20201105124838676

    Sentinel流控-预热

    公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值。

    Warm Up方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮

    image-20201105130526446

    。

    在5s之前阈值为3,5s后阈值为10

    Sentinel流控-排队等待

    匀速排队,让请求以匀速的速度通过,阈值类型必须设置成QPS,否则无效

    匀速排队方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏铜算法。

    这种方式主要用于处理间隔突发的流量,例如消息队列。假如在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多与请求。

    image-20201105131639621

    /testA每秒1次,超过的话就排队等待,等待的超时时间为20000毫秒。

  • 相关阅读:
    Android轩辕剑之ActionBar之三
    Android轩辕剑之ActionBar之二
    Android轩辕剑之ActionBar之一
    使用Android OpenGL ES 2.0绘图之六:响应触摸事件
    使用Android OpenGL ES 2.0绘图之五:添加运动
    使用Android OpenGL ES 2.0绘图之四:应用投影和相机视口
    使用Android OpenGL ES 2.0绘图之三:绘制形状
    使用Android OpenGL ES 2.0绘图之二:定义形状
    随笔编号-16 MySQL查看表及索引大小方法
    随笔编号-14 数据库连接最大数问题
  • 原文地址:https://www.cnblogs.com/striver20/p/13966807.html
Copyright © 2011-2022 走看看