sentinel实现限流,并通过nacos持久化配置

官方demo:https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-nacos-datasource/src/main/java/com/alibaba/csp/sentinel/demo/datasource/nacos

官方说明:https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95

准备工作

POM

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

yml配置

spring:
  application:
    name: SYSTEM-SERVICE
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: IP:PORT #nacos服务器地址
            dataId: ${spring.application.name}-SENTINEL.json
            groupId: SYSTEM_GROUP
            data-type: json
            rule-type: flow
            namespace: 816a22e3-068b-4729-adcd-73807baf9710 #命名空间

nacos配置sentinel文件

[
    {
        "resource": "queryDepartment",
        "limitApp": "default",
        "grade": "1",
        "count": "5",
        "strategy": "0",
        "controlBehavior": "0",
        "clusterMode": false
    }
]
  • resource:资源名,即限流规则的作用对象
  • count:限流阈值
  • grade:限流阈值类型(QPS 或并发线程数)
  • limitApp:流控针对的调用来源,若为 default 则不区分调用来源
  • strategy:调用关系限流策略
  • controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
  • clusterMode:是否集群

后台使用

业务类

/**
  * 获取部门表格
  * @param commonRequest
  * @return
  */
 @PostMapping("/queryDepartment")
 @SentinelResource(value = "queryDepartment", // 资源名
         blockHandlerClass = CustomerBlockHandler.class, // 自定义限流处理类,当发生限流时,会去此类调用blockHandler 
         blockHandler = "handlerException") // 限流回调方法
 public CommonResponse<List<DepartmentVo>> doQueryDepartment(@RequestBody CommonRequest<DepartmentQueryVo> commonRequest){
     log.info("成功进入【获取部门表格】,commonRequest:{}", commonRequest.toString());
     return CommonResponse.Builder.success(pageInfo);
 }

自定义限流处理类

public class CustomerBlockHandler {
	// 注意1:返回值类型必须与业务方法的返回值类型相同
	// 注意2:参数必须有业务方法参数,且最后增加一个 BlockException exception
	// 注意3:此方法必须是static
    public static CommonResponse handlerException(@RequestBody CommonRequest commonRequest, BlockException exception){
        return CommonResponse.Builder.fail(ExceptionEnum.GATEWAY_EXCEPTION.getCode(), "系统繁忙,请稍后再试!");
    }
}

sentinel控制台

我们可以通过部署sentinel的 ip:port 来访问sentinel控制台,默认账号密码都是sentinel
在这里插入图片描述刚进去时首页一般都是空的,因为sentinel是懒加载机制,只有当服务发起了请求,控制台才能看到并进行操作。

簇点链路

显示了该服务发起的请求列表
在这里插入图片描述

流控规则

这里是我配置的一个流控规则
在这里插入图片描述

流控模式

直接

直接->快速失败为默认效果
在这里插入图片描述

  • QPS:表示1秒钟内点击的次数
  • 单机阈值:若1秒内请求次数超过该阈值则直接快速失败

默认返回:Blocked by Sentinel(flow limiting)

关联

  • 是什么
    当关联的资源达到阈值时,就限流自己
    在这里插入图片描述

流控效果

直接->快速失败(默认的流控处理)

直接失败,抛出异常:Blocked by Sentinel(flow limiting)

预热

公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值

应用场景:秒杀系统在开启瞬间,会有很多流量上来,很可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。

排队等待

注意:匀速排队,阈值必须设置为QPS
在这里插入图片描述

规则持久化

是什么

一旦我们重启应用,sentinel规则消失,生产环境需要将配置规则进行持久化

怎么玩

将限流规则持久进Nacos保存,只要触发某个请求,sentinel控制台的流控规则就能看得到,只要Nacos里面的配置不删除,针对服务上的流控规则持续有效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值