Sentinel实现接口流量控制

发布时间 2023-08-23 19:05:13作者: strongmore

简介

Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。

启动控制台

下载地址

java -Dserver.port=8089 -Dcsp.sentinel.dashboard.server=localhost:8089 -Dproject.name=sentinel-dashboard -jar  sentinel-dashboard-1.8.6.jar

注意不要使用windows下的PowerShell,要使用默认的命令行工具(cmd),不然报错误: 找不到或无法加载主类 .port=8089

http://localhost:8089 来打开控制台,默认账号密码 sentinel/sentinel

image

客户端使用

添加依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.6.3</version>
</dependency>
<!-- sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

添加控制台和nacos的配置

通过nacos来存储限流规则

spring:
  application:
    name: spring-seata-product
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8089
      datasource:
        ds:
          nacos:
            server-addr: 42.192.20.119:8848
            data_id: ${spring.application.name}-flow-rule.json
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: flow

具体规则如下

[
    {
	"resource": "/info", // 限制的资源
	"limitApp": "default", 
	"grade": 1, // 基于QPS控制
	"count": 2, // 限流阈值
	"strategy": 0, // 根据调用方限流
	"controlBehavior": 0, // 控制手段 超过直接拒绝
	"clusterMode": false
    }
]

更多字段的含义可以查看官方文档,或者查看源码中的 com.alibaba.csp.sentinel.slots.block.flow.FlowRule类。

定义资源

@RestController
public class HealthController {

    @SentinelResource(value = "/info")
    @GetMapping("/info")
    public String info() {
        return "success";
    }
}

通过@SentinelResource注解来定义资源

限流效果

image

Blocked by Sentinel (flow limiting)

原理分析

  1. com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration配置类中配置了CommonFilter
  2. com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration配置类中配置了SentinelResourceAspect,拦截所有包含@SentinelResource注解的方法
  3. 过滤器和拦截器最终都会进入com.alibaba.csp.sentinel.SphU的entry()方法
  4. 会进入com.alibaba.csp.sentinel.slots.block.flow.FlowSlot的entry()方法
  5. 使用FlowRuleChecker来进行流量检查,如果不能通过,抛出FlowException异常,过滤器捕获此异常做处理。

参考

Spring Boot 集成 Sentinel 实现接口流量控制
springboot集成Sentinel & Nacos「持久化」
阿里 Sentinel 源码解析-javadoop.com
官方文档