06、定义限流lua脚本
新建一个iplimite.lua文件,放在resources目录下的lua文件夹下:
-- 为某个接口的请求IP设置计数器,比如:127.0.0.1请求课程接口
-- KEYS[1] = 127.0.0.1 也就是用户的IP
-- ARGV[1] = 过期时间 30m
-- ARGV[2] = 限制的次数
local limitCount = redis.call('incr',KEYS[1]);
if limitCount == 1 then
redis.call("expire",KEYS[1],ARGV[2])
end
-- 如果次数还没有过期,并且还在规定的次数内,说明还在请求同一接口
if limitCount > tonumber(ARGV[1]) then
return false
end
return true
07、Lua限流脚本配置类
lua配置类主要是去加载lua文件的内容,到时内存中。方便redis去读取和控制。
package com.taimi.config;
@Configuration
public class LuaConfiguration {
/**
* 将lua脚本的内容加载出来放入到DefaultRedisScript
* @return
*/
@Bean
public DefaultRedisScript<Boolean> ipLimitLua() {
DefaultRedisScript<Boolean> defaultRedisScript = new DefaultRedisScript<>();
defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/iplimiter.lua")));
defaultRedisScript.setResultType(Boolean.class);
return defaultRedisScript;
}
/**
* 将lua脚本的内容加载出来放入到DefaultRedisScript
* @return
*/
@Bean
public DefaultRedisScript<Boolean> ipLimiterLuaScript() {
DefaultRedisScript<Boolean> defaultRedisScript = new DefaultRedisScript<>();
defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/iplimiter2.lua")));
defaultRedisScript.setResultType(Boolean.class);
return defaultRedisScript;
}
}
08、限流注解
package com.taimi.aop;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AcessLimter {
// 每timeout限制请求的个数
int limit() default 10;
// 时间,单位默认是秒
int timeout() default 1;
}
09、请求获取用户IP工具类
package com.taimi.aop;
public class RequestUtils {
public static String getIpAddr(HttpServletRequest request)
{
if (request == null)
{
return "unknown";
}
String ip = request.getHeader(</