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

19 篇文章 0 订阅
16 篇文章 0 订阅

四.Sentinel

1.知识点

官网
在这里插入图片描述
主要特性
在这里插入图片描述
在这里插入图片描述

2.下载

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

java -jar sentinel-dashboard-1.7.2.jar

在这里插入图片描述
用户和密码都是sentinel
在这里插入图片描述

3.构建项目(8401)

①创建module

在这里插入图片描述

②编写pom文件
 <dependencies>

        <!-- nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- sentinel-datasource-naso 持久化 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

        <!-- 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>

        <!--引入自定义的api通用包  可以使用公用的entities-->
        <dependency>
            <groupId>com.hry.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <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>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>
③修改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
刷新网页发现啥也没有
在这里插入图片描述
由于sentinel采用懒加载,因此我们要先访问一次8401。
在这里插入图片描述
然后刷新,有了
在这里插入图片描述
刷新几次A和B
在这里插入图片描述
结论:sentinel8080正在监控8401

4.流控规则

在这里插入图片描述

①快速失败
(1)QPS直接快速失败

QPS = req/sec = 请求数/秒

设值每秒请求数为1
在这里插入图片描述
在这里插入图片描述
访问testA,1s点一次
在这里插入图片描述
1s内访问多次,被sentinel限流
在这里插入图片描述

(2)线程直接快速失败

修改controller代码

让A休眠0.8s

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

在这里插入图片描述
在这里插入图片描述
两个一起访问testA
在这里插入图片描述

(3)关联(以QPS为例)

将controller改回注释掉sleep
新建流控
在这里插入图片描述
现在疯狂访问B,导致A限流
在这里插入图片描述

②预热(warm up)

在这里插入图片描述
新建
在这里插入图片描述
在这里插入图片描述
刚开始5s会限流,之后正常
在这里插入图片描述

③排队等待

在这里插入图片描述
在这里插入图片描述
编辑规则
在这里插入图片描述
在这里插入图片描述

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

sentinel断路器没有半开状态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

①RT

在这里插入图片描述

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

在这里插入图片描述

(3)测试

测试狂点F5
在这里插入图片描述

②异常比例

在这里插入图片描述
controller新增

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

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

在这里插入图片描述
在这里插入图片描述

③异常数

在这里插入图片描述
controller

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

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

在这里插入图片描述
在这里插入图片描述

6.热点规则

@SentinelResource与@HystrixCommand相似
在这里插入图片描述

①修改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";
    }
②配置热点

在这里插入图片描述
在这里插入图片描述
注意这两个与controller方法相匹配 一个带/ 一个不带/
在这里插入图片描述
配置热点,参数索引是指传入的参数的下标从0开始 p1是0 p2是1
在这里插入图片描述

③测试

包含p1的1s超过1次访问都会flow limit而且执行了我们指定的兜底方法。如果不指定兜底方法前台会直接显示error page
比如localhost:8401/testHotKey?p1=1&p2=2
在这里插入图片描述
比如localhost:8401/testHotKey?p1=1
在这里插入图片描述
而不包含p1的就可以正常访问
比如localhost:8401/testHotKey在这里插入图片描述
比如localhost:8401/testHotKey?p2=2
在这里插入图片描述

④参数例外项目
(1)配置

编辑配置,点高级,可以设置一个或多个例外值
在这里插入图片描述
在这里插入图片描述

(2)测试

在这里插入图片描述

(3)注意

如果手动添加

int a = 1/0;

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

7.系统规则

新增
在这里插入图片描述
测试
设置了系统规则,controller中所有请求都需要遵循规则。
比如按照如上图所示设置,QPS,每秒超过1次就会限流。在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值