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毫秒。

原文地址:https://www.cnblogs.com/striver20/p/13966807.html