开发喵星球

若依微服务实现Sentinel限流(231)

Sentinel 支持对 Spring Cloud GatewayNetflix Zuul 等主流的 API Gateway 进行限流。

1、添加依赖

网关服务(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>

2、限流规则配置类

编写 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 次。

3、测试验证

一分钟内访问三次系统服务出现异常提示表示限流成功。
启动网关服务 RuoYiGatewayApplication.java,访问 /system/** 接口进行测试。当在 60 秒内访问超过 3 次时,会触发限流,返回 429 Too Many Requests 错误,并执行 SentinelFallbackHandler 中定义的降级逻辑。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-06-05 17:21:37 阅读量:186
<<   >>


powered by kaifamiao