SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流

四.Sentinel

1.知识点

官网
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第1张图片
主要特性
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第2张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第3张图片

2.下载

点击这里下载
运行
进入目录,cmd

java -jar sentinel-dashboard-1.7.2.jar

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第4张图片
用户和密码都是sentinel
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第5张图片

3.构建项目(8401)

①创建module

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第6张图片

②编写pom文件

 <dependencies>

        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>

        
        <dependency>
            <groupId>com.alibaba.cspgroupId>
            <artifactId>sentinel-datasource-nacosartifactId>
        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>com.hry.springcloudgroupId>
            <artifactId>cloud-api-commonsartifactId>
            <version>${project.version}version>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <scope>runtimescope>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

③修改yml文件

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        #nacos服务注册中心地址
        server-addr: localhost:8848
    sentinel:
      transport:
        #配置sentinel dashboard地址
        dashboard: localhost:8080
        #默认8719端口,端口被占用会自动从8719开始依次+1开始扫描,直至找到未被占用的端口
        port: 8719
management:
  endpoints:
    web:
      exposure:
        include: "*"

④创建主启动类

package com.hry.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

⑤业务代码

@RestController
public class FlowLimitController {

    @GetMapping(value = "/testA")
    public String testA(){
        return "testA";
    }

    @GetMapping(value = "/testB")
    public String testB(){
        return "testB";
    }
}

⑥将nacos配置改回去

略,集群改回单机 端口号改回8848

⑦测试

cmd启动启动nacos8848,sentinel8080,启动微服务8401
刷新网页发现啥也没有
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第7张图片
由于sentinel采用懒加载,因此我们要先访问一次8401。
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第8张图片
然后刷新,有了
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第9张图片
刷新几次A和B
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第10张图片
结论:sentinel8080正在监控8401

4.流控规则

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第11张图片

①快速失败

(1)QPS直接快速失败

QPS = req/sec = 请求数/秒

设值每秒请求数为1
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第12张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第13张图片
访问testA,1s点一次
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第14张图片
1s内访问多次,被sentinel限流
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第15张图片

(2)线程直接快速失败

修改controller代码

让A休眠0.8s

@GetMapping(value = "/testA")
    public String testA(){
        try {
            TimeUnit.MILLISECONDS.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "testA";
    }

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第16张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第17张图片
两个一起访问testA
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第18张图片

(3)关联(以QPS为例)

将controller改回注释掉sleep
新建流控
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第19张图片
现在疯狂访问B,导致A限流
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第20张图片

②预热(warm up)

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第21张图片
新建
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第22张图片
在这里插入图片描述
刚开始5s会限流,之后正常
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第23张图片

③排队等待

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第24张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第25张图片
编辑规则
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第26张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第27张图片

5.降级规则(熔断降级)

sentinel断路器没有半开状态
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第28张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第29张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第30张图片

①RT

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第31张图片

(1)controller增加方法
@GetMapping(value = "/testC")
    public String testC(){
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "testC";
    }
(2)新增降级规则

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第32张图片

(3)测试

测试狂点F5
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第33张图片

②异常比例

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第34张图片
controller新增

 @GetMapping(value = "/testD")
    public String testD(){

        int a = 1/0;
        return "testD";
    }

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第35张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第36张图片

③异常数

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第37张图片
controller

  @GetMapping(value = "/testE")
    public String testE(){

        int a = 1/0;
        return "testE";
    }

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第38张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第39张图片

6.热点规则

@SentinelResource与@HystrixCommand相似
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第40张图片

①修改controller

@GetMapping(value = "/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey") //value任意,比如abc,唯一即可
    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 exception){

        //sentinel 系统默认为Blocked by sentinel(flow limiting)
        return "########################deal_testHotKey";
    }

②配置热点

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第41张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第42张图片
注意这两个与controller方法相匹配 一个带/ 一个不带/
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第43张图片
配置热点,参数索引是指传入的参数的下标从0开始 p1是0 p2是1
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第44张图片

③测试

包含p1的1s超过1次访问都会flow limit而且执行了我们指定的兜底方法。如果不指定兜底方法前台会直接显示error page
比如localhost:8401/testHotKey?p1=1&p2=2
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第45张图片
比如localhost:8401/testHotKey?p1=1
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第46张图片
而不包含p1的就可以正常访问
比如localhost:8401/testHotKeySpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第47张图片
比如localhost:8401/testHotKey?p2=2
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第48张图片

④参数例外项目

(1)配置

编辑配置,点高级,可以设置一个或多个例外值
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第49张图片
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第50张图片

(2)测试

SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第51张图片

(3)注意

如果手动添加

int a = 1/0;

运行时异常,兜底方法是不能处理的,这样会前端会进入error page页面,如何处理后面会说到。

7.系统规则

新增
SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第52张图片
测试
设置了系统规则,controller中所有请求都需要遵循规则。
比如按照如上图所示设置,QPS,每秒超过1次就会限流。SpringCloud学习笔记15——高级篇之SpringCloud Alibaba Sentinel实现熔断与限流_第53张图片

你可能感兴趣的:(Java,Web,SpringCloud,SpringBoot)