Sentinel
支持对 Spring Cloud Gateway
、Netflix Zuul
等主流的 API Gateway
进行限流。
网关服务(ruoyi-gateway
)的 pom.xml
文件中添加以下依赖
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel Gateway -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
编写
GatewayConfig
配置类,实现Sentinel
限流规则的配置
package com.ruoyi.gateway.config;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.PostConstruct;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
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.SentinelGatewayFilter;
import com.ruoyi.gateway.handler.SentinelFallbackHandler;
/**
* 网关限流配置
*
* @author ruoyi
*/
@Configuration
public class GatewayConfig
{
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelFallbackHandler sentinelGatewayExceptionHandler()
{
return new SentinelFallbackHandler();
}
@Bean
@Order(-1)
public GlobalFilter sentinelGatewayFilter()
{
return new SentinelGatewayFilter();
}
@PostConstruct
public void doInit()
{
// 加载网关限流规则
initGatewayRules();
}
/**
* 网关限流规则
*/
private void initGatewayRules()
{
Set<GatewayFlowRule> rules = new HashSet<>();
rules.add(new GatewayFlowRule("ruoyi-system")
.setCount(3) // 限流阈值
.setIntervalSec(60)); // 统计时间窗口,单位是秒,默认是 1 秒
// 加载网关限流规则
GatewayRuleManager.loadRules(rules);
}
}
在该配置类中:
- 定义了
SentinelFallbackHandler
作为限流降级处理器。- 注册了
SentinelGatewayFilter
作为全局过滤器,用于实现网关限流。- 在
initGatewayRules()
方法中,配置了一个针对 “ruoyi-system
” 服务的限流规则,每60
秒内最多访问3
次。
一分钟内访问三次系统服务出现异常提示表示限流成功。
启动网关服务RuoYiGatewayApplication.java
,访问/system/**
接口进行测试。当在60
秒内访问超过3
次时,会触发限流,返回429 Too Many Requests
错误,并执行SentinelFallbackHandler
中定义的降级逻辑。
powered by kaifamiao