Sentinel——网关限流
网关限流
Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。[1]

从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:
- route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
- 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
route维度
使用时需引入以下模块(以 Maven 为例):
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
官网写的是下面的配置,可能是版本问题,我看的教程是需要配置上面的模块
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
<version>x.y.z</version>
</dependency>
完整依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zjw</groupId>
<artifactId>sc-06-sentinel-gateway-router-9000</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sc-06-sentinel-gateway-router-9000</name>
<description>sc-06-sentinel-gateway-router-9000</description>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!--sentinel与spring cloud gateway整合依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder-jammy-base:latest</builder>
</image>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 9000
spring:
application:
name: sentinel-gateway # 微服务名称
cloud:
nacos:
discovery:
server-addr: nacos-local:8848 # nacos注册中心地址
username: nacos # 用户名密码
password: nacos
gateway:
routes:
- id: get_route
uri: lb://depart-consumer
predicates:
- Path=/depart/get/**
- id: list
uri: lb://depart-consumer
predicates:
- Path=/depart/list
sentinel: # sentinel配置
eager: true # 饥饿加载,默认false
filter:
enabled: false # 若在网关流控控制台上看到了 URL 资源
transport:
port: 8719 # sentinel内部启动的http服务
dashboard: localhost:8888 # sentinel服务
启动类不需要额外配置。
sentinel控制台配置网关限流规则。

当请求过快,会出现以下界面。

控制台会报错,说方法不存在
点击查看代码
2023-12-07T02:15:29.713+08:00 ERROR 20520 --- [ctor-http-nio-3] reactor.netty.http.server.HttpServer : [c632f6fc-1, L:/[0:0:0:0:0:0:0:1]:9000 - R:/[0:0:0:0:0:0:0:1]:13569]
java.lang.NoSuchMethodError: 'org.springframework.web.reactive.function.server.ServerResponse$BodyBuilder org.springframework.web.reactive.function.server.ServerResponse.status(org.springframework.http.HttpStatus)'
at com.alibaba.csp.sentinel.adapter.gateway.sc.callback.DefaultBlockRequestHandler.htmlErrorResponse(DefaultBlockRequestHandler.java:51) ~[sentinel-spring-cloud-gateway-adapter-1.8.6.jar:na]
at com.alibaba.csp.sentinel.adapter.gateway.sc.callback.DefaultBlockRequestHandler.handleRequest(DefaultBlockRequestHandler.java:42) ~[sentinel-spring-cloud-gateway-adapter-1.8.6.jar:na]
自定义异常
重定向
package com.zjw;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
import java.util.HashMap;
import java.util.Map;
@SpringBootApplication
public class SentinelGateWay9001Application {
public static void main(String[] args) {
SpringApplication.run(SentinelGateWay9001Application.class, args);
// 初始化阻塞处理器
initBlockHandler();
}
/**
* 初始化阻塞处理器
*/
private static void initBlockHandler() {
//重定向
GatewayCallbackManager.setBlockHandler(new RedirectBlockRequestHandler("https://baidu.com"));
}
}
也可以在配置文件中添加重定向
sentinel: # sentinel配置
eager: true # 饥饿加载,默认false
filter:
enabled: false # 若在网关流控控制台上看到了 URL 资源
transport:
port: 8719 # sentinel内部启动的http服务
dashboard: localhost:8888 # sentinel服务
scg:
mode: redirect
redirect: https://baidu.com
自定义结果
package com.zjw;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
import java.util.HashMap;
import java.util.Map;
@SpringBootApplication
public class SentinelGateWay9001Application {
public static void main(String[] args) {
SpringApplication.run(SentinelGateWay9001Application.class, args);
// 初始化阻塞处理器
initBlockHandler();
}
/**
* 初始化阻塞处理器
*/
private static void initBlockHandler() {
// 自定义异常结果
GatewayCallbackManager.setBlockHandler((serverWebExchange, throwable) -> {
Map<String, Object> map = new HashMap<>();
map.put("uri", serverWebExchange.getRequest().getURI());
map.put("msg","访问量过大,稍后请重试");
map.put("code", HttpStatus.TOO_MANY_REQUESTS.value());
return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(map), Map.class);
});
}
}
也可以在配置中配置,但是显得很呆
sentinel: # sentinel配置
scg:
fallback:
mode: response
content-type: 'application/json'
response-status: 429
response-body: '{"code":"429","msg":"访问量过大,稍后请重试"}'
API维度
sentinel控制台配置


网关限流代码配置
实现api和route模式
package com.zjw;
import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@SpringBootApplication
public class SentinelGateWay9001Application {
private static final String API_GROUP1 = "API_group1";
public static void main(String[] args) {
SpringApplication.run(SentinelGateWay9001Application.class, args);
// 初始化阻塞处理器
initBlockHandler();
// 初始化网关规则
// initGatewayRuleRoute();
initGatewayRuleAPI();
}
/**
* 初始化网关规则 ROUTE
*/
private static void initGatewayRuleRoute() {
Set<GatewayFlowRule> rules = new HashSet<>();
/*
* 结合文档和sentinel配置页面来写
* 文档:https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
*/
GatewayFlowRule rule = new GatewayFlowRule();
// API资源类型 route: RESOURCE_MODE_ROUTE_ID 0, api分组:RESOURCE_MODE_CUSTOM_API_NAME 1
rule.setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID);
// 资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称
rule.setResource("get_route");
// 阈值类型 QPS:FLOW_GRADE_QPS 1 线程数:FLOW_GRADE_THREAD 0
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// QPS阈值
rule.setCount(3);
// 统计时间窗口,单位是秒,默认是 1 秒
rule.setIntervalSec(1);
// 流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败CONTROL_BEHAVIOR_DEFAULT和匀速排队CONTROL_BEHAVIOR_RATE_LIMITER两种模式,默认是快速失败0。
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
// 应对突发请求时额外允许的请求数目,默认为int类型 0
rule.setBurst(0);
rules.add(rule);
GatewayRuleManager.loadRules(rules);
}
/**
* 初始化网关规则 API
*/
private static void initGatewayRuleAPI() {
//初始化API分组
initCustomizedApis();
Set<GatewayFlowRule> rules = new HashSet<>();
/*
* 结合文档和sentinel配置页面来写
* 文档:https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
*/
GatewayFlowRule rule = new GatewayFlowRule();
// API资源类型 route: RESOURCE_MODE_ROUTE_ID 0, api分组:RESOURCE_MODE_CUSTOM_API_NAME 1
rule.setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME);
// 资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称
rule.setResource(API_GROUP1);
// 阈值类型 QPS:FLOW_GRADE_QPS 1 线程数:FLOW_GRADE_THREAD 0
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// QPS阈值
rule.setCount(3);
// 统计时间窗口,单位是秒,默认是 1 秒
rule.setIntervalSec(1);
// 流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败CONTROL_BEHAVIOR_DEFAULT和匀速排队CONTROL_BEHAVIOR_RATE_LIMITER两种模式,默认是快速失败0。
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
// 应对突发请求时额外允许的请求数目,默认为int类型 0
rule.setBurst(0);
rules.add(rule);
GatewayRuleManager.loadRules(rules);
}
/**
* 初始化API分组
*/
private static void initCustomizedApis() {
Set<ApiDefinition> definitions = new HashSet<>();
ApiDefinition api1 = new ApiDefinition(API_GROUP1)
//匹配模式 支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX),默认是精确匹配
.setPredicateItems(new HashSet<>() {{
add(new ApiPathPredicateItem().setPattern("/depart/update"));
add(new ApiPathPredicateItem().setPattern("/depart/get/.*")
.setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_REGEX));
}});
definitions.add(api1);
GatewayApiDefinitionManager.loadApiDefinitions(definitions);
}
/**
* 初始化阻塞处理器
*/
private static void initBlockHandler() {
//重定向
// GatewayCallbackManager.setBlockHandler(new RedirectBlockRequestHandler("https://baidu.com"));
// 自定义异常结果
GatewayCallbackManager.setBlockHandler((serverWebExchange, throwable) -> {
Map<String, Object> map = new HashMap<>();
map.put("uri", serverWebExchange.getRequest().getURI());
map.put("msg","访问量过大,稍后请重试");
map.put("code", HttpStatus.TOO_MANY_REQUESTS.value());
return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(map), Map.class);
});
}
}
Sentinel——网关限流的更多相关文章
- Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!
大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...
- Spring Cloud Alibaba | Sentinel: 服务限流基础篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...
- Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...
- 流量治理神器-Sentinel的限流模式,选单机还是集群?
大家好,架构摆渡人.这是我的第5篇原创文章,还请多多支持. 上篇文章给大家推荐了一些限流的框架,如果说硬要我推荐一款,我会推荐Sentinel,Sentinel的限流模式分为两种,分别是单机模式和集群 ...
- Spring Cloud Gateway 网关限流
Spring Cloud Gateway 限流 一.背景 二.实现功能 三.网关层限流 1.使用默认的redis来限流 1.引入jar包 2.编写配置文件 3.网关正常响应 4.网关限流响应 2.自定 ...
- spring cloud gateway整合sentinel作网关限流
说明: sentinel可以作为各微服务的限流,也可以作为gateway网关的限流组件. spring cloud gateway有限流功能,但此处用sentinel来作为替待. 说明:sentine ...
- SpringBoot 2.0 + 阿里巴巴 Sentinel 动态限流实战
前言 在从0到1构建分布式秒杀系统和打造十万博文系统中,限流是不可缺少的一个环节,在系统能承受的范围内既能减少资源开销又能防御恶意攻击. 在前面的文章中,我们使用了开源工具包 Guava 提供的限流工 ...
- Dubbo学习系列之十(Sentinel之限流与降级)
各位看官,先提个问题,如果让你设计一套秒杀系统,核心要点是啥???我认为有三点:缓存.限流和分离.想当年12306大面积崩溃,还有如今的微博整体宕机情况,感觉就是限流降级没做好,"用有限的资 ...
- 微服务架构spring cloud - gateway网关限流
1.算法 在高并发的应用中,限流是一个绕不开的话题.限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池.线程池). ...
随机推荐
- 基于deepseek模型知识库,Cherry Studio和AnythingLLM使用效果对比
基于deepseek模型知识库,Cherry Studio和AnythingLLM使用效果对比 目 录 1. 使用效果对比基础 2. Cherry Studio和Any ...
- Atcoder ABC388F Dangerous Sugoroku 题解 [ 蓝 ] [ 矩阵加速 ] [ 状压矩乘 ] [ 模拟 ]
Dangerous Sugoroku:赛时写了矩乘 T 飞了,受到 sunkuangzheng 大佬的启发才知道要状压矩乘. 暴力矩乘思路 直接像过河那样写模拟细节非常多,于是考虑像美食家一样的思路, ...
- windows10专业版代码永久激活
1."Win+R"打开运行对话框,输入命令slmgr.vbs -xpr 可以查看当前系统的激活信息 2. 在电脑图标右键,打开属性,查看自己win10系统版本 3. 在开始菜单右键 ...
- Linux目录管理命令
1. pwd :显示当前所在目录的路径 1.1 语法格式 pwd #直接按回车键 1.2 实践案例 案例:查看当前所在目录路径 [root@yyds ~]# pwd /root --->显示的是 ...
- [PA2021] Od deski do deski 题解
好题好题,难者不会会者不难,我是前者. 实际上加入就可以合法的数是很好计算的.考虑现在所有前缀合法串后的字符实际上都可以满足条件. 容易想到根据是否合法设置状态.设 \(f_{i,j}/g_{i,j} ...
- es5经典数组去重
es5经典数组去重 for (var i = 0; i < arr.length; i++) { for (var j = 1; j < arr.length; j++) { if (ar ...
- 【软件开发】Glob通配符
[软件开发]Glob 通配符 *:匹配除"/"以外的字符. **:匹配所有字符. ?:匹配一个字符. [...]:匹配指定字符,如[ABC]就匹配 ABC 三个字母,添加!还可以反 ...
- Linux - top相关的快捷键
q:退出top命令窗口(quit). k:按照进程ID终止(kill)一个进程.例如,你可以输入k,然后输入进程的PID来终止它. r:重新设置进程的优先级.输入r后,你可以输入新的优先级值. f:进 ...
- ES - 概述
前言 Q1:ElasticSearch 是什么? 为什么要学习? ElasticSearch 是一个分布式.可扩展.实时的搜索和分析引擎,基于 Lucene 构建.它可以用于全文搜索.结构化搜索.分析 ...
- 腾讯元宝登顶App Store免费榜榜首!国产AI APP混战升级
最近,国产AI APP市场热闹非凡,竞争愈发激烈.其中,腾讯元宝的表现格外亮眼,它在短短一周内,借助微信的强大助力,一路逆袭,成功登上苹果App Store免费榜榜首.这一变化不仅展现了腾讯在AI领域 ...