SpringCloud Sentinel学习笔记

  • nacos下载地址,建议下载2.0.2,2.0.3对于部署好像有点问题
  • sentinel下载地址
  • sentinelGitHub文档
  • sentient官方文档
  • Spring Cloud Alibaba Sentinel 的示例可以参考 sentinel-guide-spring-cloud
  • SpringCloud Alibaba 组件版本关系重要!),

Sentinel:

面向分布式服务架构的高可用流量控制组件

一、模块准备

  • 继续这篇博客的代码

1、启动nacos

C:\nacos-server-2.0.2\nacos\bin>startup.cmd -m standalone

2、启动sentinel dashboard

C:\jar>java -jar sentinel-dashboard-1.8.2.jar

3、新建模块cloud-alibaba-sentinel-service8401

SpringCloud Sentinel学习笔记_第1张图片

3.1、添加依赖


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-alibabaartifactId>
        <groupId>com.hzlgroupId>
        <version>0.0.1-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>cloud-alibaba-sentinel-service8401artifactId>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        <dependency>
            <groupId>com.alibaba.cspgroupId>
            <artifactId>sentinel-coreartifactId>

        dependency>

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>

        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
    dependencies>
project>

3.2、配置文件

server:
  port: 8401
spring:
  application:
    name: cloud-alibaba-sentinel-service

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719

3.3、启动类

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

3.4、控制层

@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {

    @GetMapping("/test1")
    public String test1(){
        return "test1";
    }

    @GetMapping("/test2")
    public String test2(){
        return "test2";
    }
}

3.5、访问地址

http://localhost:8401/sentinel/test2

3.6、sentinel控制台地址

http://localhost:8080/

!一定要先访问,控制台才有数据
SpringCloud Sentinel学习笔记_第2张图片

二、快速开始

Sentinel的基本概念:

1、资源

  • 资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
  • 只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

2、规则

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

Sentinel功能

1. 流量控制

SpringCloud Sentinel学习笔记_第3张图片

1.1.流控规则说明

  • 流量控制请看看看看官方文档
流量控制(flow control)
  • 其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
  • 一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
  1. resource:资源名,即限流规则的作用对象
  2. count: 限流阈值
  3. grade: 限流阈值类型(QPS 或并发线程数)
  4. limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
  5. strategy: 调用关系限流策略
  6. controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

SpringCloud Sentinel学习笔记_第4张图片

规则说明:

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

ps:

QPS和线程数对比:

情形:一堆人去办银行卡:

  • GPS:银行大门只放规定人数进去。
  • 线程数:银行大门随便进,规定办理窗口只有这么多。

1.2.流控规则演示

eg:

QPS-直接-快速失败

SpringCloud Sentinel学习笔记_第5张图片
表示 1秒钟内查询1次 就是OK,若超过次数1 (连续刷新两次),就直接-快速失败,报默认错误
SpringCloud Sentinel学习笔记_第6张图片
测试线程数多开几个浏览器窗口就好了试试~ 。
测试线程数可使用postman
SpringCloud Sentinel学习笔记_第7张图片
SpringCloud Sentinel学习笔记_第8张图片
postman绝对有用,没效果多试几次或降低间隔
com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

eg:

QPS-Warm Up-快速失败

  • Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。详细文档流量控制 - Warm Up 文档
    SpringCloud Sentinel学习笔记_第9张图片

eg:

QPS-排队等待-快速失败

  • 匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。详细文档可以参考 流量控制 - 匀速器模式
    SpringCloud Sentinel学习笔记_第10张图片

2. 熔断降级

  • 官网官网官网!

2.1.熔断策略

熔断策略(重要)

  • 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
  • 异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
  • 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

2.2.热点限流

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

2.2.1.需要添加依赖
<dependency>
    <groupId>com.alibaba.cspgroupId>
    <artifactId>sentinel-parameter-flow-controlartifactId>
    <version>x.y.zversion>
dependency>
2.2.2.测试接口
	@GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey", blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                             @RequestParam(value = "p2",required = false) String p2){
        return "---------testHotKey方法--------------";
    }

    public String deal_testHotKey(String p1, String p2, BlockException e){
        return "---------testHotKey处理热点方法--------------";
    }
2.2.2.测试访问:http://localhost:8401/sentinel/testHotKey?p1=1&p2=2

SpringCloud Sentinel学习笔记_第11张图片

2.2.3.热点规则配置,阈值一般指访问次数

SpringCloud Sentinel学习笔记_第12张图片

2.2.4.测试结果,快速刷新两次,调用热点处理方法

SpringCloud Sentinel学习笔记_第13张图片

2.2.5 热点例外配置

SpringCloud Sentinel学习笔记_第14张图片

你可能感兴趣的:(SpringCloud,Alibaba,java,spring,boot,alibaba)