Sentinel的学习

Sentinel的流控规则学习

1、Sentinel控制台的下载

下载地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.3

2、Sentinel控制台的启动

java -jar sentinel-dashboard-1.8.3.jar

3、测试

浏览器输入:localhost:8080
账号密码: sentinel/sentinel
在这里插入图片描述

4、springboot整合sentinel

pom.xml引入依赖

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
	<version>2021.1</version>
</dependency>

添加配置

server:
  port: 9090

spring:
  application:
    name: springboot-sentinel
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: cong
        group: cong
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080 #配置Sentinel dashboard地址

UserController.java

@RestController
public class UserController {

    @GetMapping(value = "/getuser")
    @SentinelResource(value = "user",blockHandler = "getUserHandler",blockHandlerClass = UserController.class)
    public String getUser(String userId) {
        if (StringUtils.isNotEmpty(userId) && userId.equals("123456")){
            return "用户存在";
        }
        return "用户不存在";
    }
    
    @GetMapping("/adduser")
    public String sentinelB(){
        return "增加用户";
    }
}

测试
在这里插入图片描述
然后查看sentinel控制台,只有请求一次才能看到
在这里插入图片描述

5、流控规则

官网:https://sentinelguard.io/zh-cn/docs/flow-control.html

流控规则的各个属性

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

详细测试参考:https://blog.csdn.net/qq_41895733/article/details/121899301

新增流控

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

资源名称就是我们的接口访问路径,然后我们一秒一次访问一下接口(正常)
http://localhost:9090/getuser?userId=123456
可以看到正常返回数据

在这里插入图片描述

接下来我们快速请求接口,一秒钟点击多次,发现已经被限流了

在这里插入图片描述

然后发现重启项目后,配置的流控规则消失了

解决方案:通过nocas

docker启动nacos

docker run --env MODE=standalone --restart=always --name ybchen-nacos1 -d -p 8848:8848 nacos/nacos-server

nacos新增配置,可以查看nacos的使用:https://blog.csdn.net/qq_42665745/article/details/127442701

在这里插入图片描述

[
    {
        "resource": "/getuser",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    },
    {
        "resource": "/adduser",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

流控配置注解

  • resource: 需要限流的接口路径
  • limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
  • grade: 限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
  • count: 限流阈值
  • strategy: 调用关系限流策略
  • controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

项目增加依赖

<dependency>
	<groupId>com.alibaba.csp</groupId>
	<artifactId>sentinel-datasource-nacos</artifactId>
	<version>1.8.0</version>
</dependency>

修改配置文件

server:
  port: 9090

spring:
  application:
    name: springboot-sentinel
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: cong
        group: cong
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080 #配置Sentinel dashboard地址
      datasource:
        # 名字随意
        ds:
          nacos:
            # nacos的访问地址,,根据上面准备工作中启动的实例配置
            server-add: 127.0.0.1:8848
            # nacos中存储规则的groupId
            groupId: DEFAULT_GROUP
            # nacos中存储规则的dataId
            dataId: ${spring.application.name}-rules
            # 用来定义存储的规则类型
            rule-type: flow
            data-type: json

然后重启项目,重复点击http://localhost:9090/getuser?userId=123456,发现流控效果生效了,证明nocas存储流控规则成功了

6、@SentinelResource注解的使用

@SentinelResource的属性

  • value:作用指定资源名称,必填
  • entryType:entry类型,标记流量的方向,指明是出口流量,还是入口流量;取值 IN/OUT ,默认是OUT。非必填
  • blockHandler:处理BlockException的函数名称,函数要求为
    必须是public
    返回类型与原方法一致
    参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数
    默认需和原方法在同一个类中,如果希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法
  • blockHandlerClass:存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析。函数要求为:
    必须是public
    返回类型与原方法一致
    参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数
  • fallback:用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了execptionsToIgnore 里面排除掉的异常类型)进行处理,函数要求为:
    返回类型与原方法一致
    参数类型需要和原方法相匹配,Sentinel 1.6版本之后,也可在方法最后加上Throwable类型的参数
    默认需和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackClass,并指定fallbackClass里面的方法
  • fallbackClass:存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
  • defaultFallback:用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:
    返回类型与原方法一致
    方法参数列表为空,或者有一个Throwable类型的参数
    默认需要和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackclass,并指定fallbackClass里面的方法。
  • exceptionsToIgnore:指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出
  • exceptionsToTrace:需要trace的异常

修改接口代码,增加@SentinelResource注解

@RestController
public class UserController {

    @GetMapping(value = "/getuser")
    @SentinelResource(value = "user",blockHandler = "getUserHandler",blockHandlerClass = UserController.class)
    public String getUser(String userId) {
        if (StringUtils.isNotEmpty(userId) && userId.equals("123456")){
            return "用户存在";
        }
        return "用户不存在";
    }

    public static String getUserHandler(String userId, BlockException e) {
        return "不好意思,前方拥挤,请您稍后再试";
    }

    @GetMapping("/adduser")
    public String sentinelB(){
        return "增加用户";
    }
}

修改nacos的配置后,发布
在这里插入图片描述
重复点击http://localhost:9090/getuser?userId=123456测试
在这里插入图片描述

7、熔断、热点规则

其他的熔断规则、热点规则参考:https://blog.csdn.net/qq_42682745/article/details/121172500

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值