zl程序教程

您现在的位置是:首页 > 

当前栏目

aizuda-limiter

2023-06-13 09:11:18 时间

有人问我限流怎么做,单独抽出来说一下:

这里使用aizuda-limiter,文档:http://doc.aizuda.com/pages/9xd009/

example仓库:https://gitee.com/aizuda/aizuda-components-examples/blob/master/aizuda-limiter-example

首先引入:

<dependency>
  <groupId>com.aizuda</groupId>
  <artifactId>aizuda-limiter</artifactId>
  <version>1.0.0</version>
</dependency>

然后进行配置限流策略:

package com.aizuda.limiter.example;

import com.aizuda.limiter.metadata.MethodMetadata;
import com.aizuda.limiter.strategy.IKeyGenerateStrategy;
import org.springframework.stereotype.Component;

@Component
public class UserRateLimitStrategy implements IKeyGenerateStrategy {
    public final static String TYPE = "user";


    @Override
    public String getType() {
        // 请保证唯一性
        return TYPE;
    }

    @Override
    public String getKey(MethodMetadata methodMetadata, String parseKey) {
        return "admin";
    }
}

Controller上加上注解

package com.aizuda.limiter.example;

import com.aizuda.limiter.annotation.RateLimit;
import com.aizuda.limiter.strategy.IpKeyGenerateStrategy;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    /**
     * 限流
     * <p>
     * 测试多次访问观察浏览器及控制台输出日志
     * <p>
     * http://localhost:8080/test?name=abc
     */
    @GetMapping("/test")
    @RateLimit(
            // 唯一标示,支持SpEL表达式(可无),#name 为获取当前访问参数 name 内容
            key = "#name",
            // 限定阈值,时间间隔 interval 范围内超过该数量会触发锁
            count = 2,
            // 限制间隔时长(可无,默认 3 分钟)例如 5s 五秒,6m 六分钟,7h 七小时,8d 八天
            interval = "100s",
            // 策略(可无) ip 为获取当前访问IP地址(内置策略),自定义策略 user 为获取当前用户
            strategy = {IpKeyGenerateStrategy.TYPE, UserRateLimitStrategy.TYPE},
            // 提示消息(可无)
            message = "请勿频繁操作"
    )
    public String test(String name) {
        return "test" + name;
    }

}