当前位置: 首页 > news >正文

一对一视频app开发,基于Redis+Lua实现分布式限流 - 云豹科技

一对一视频app开发,基于Redis+Lua实现分布式限流

一、新建一个Mavne项目,取名为rate_limiter,并引入Lombok和guava的依赖。

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>29.0-jre</version>
</dependency>

二、在rate_limiter项目下新建一个名为ratelimiter_annotation的子模块,在该模块的pom文件中添加redis的依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

三、在ratelimiter_annotation模块的src/main/java目录下创建service包,在service包下创建一个名为AccessLimiter的类。

@Service
@Slf4j
public class AccessLimiter {@Autowiredprivate StringRedisTemplate redisTemplate;/*** DefaultRedisScript类用来加载脚本的,并设置相应的数据类型来接收lua脚本返回的数据,* 这个泛型类在使用时设置泛型是什么类型,脚本返回的结果就是用什么类型接收。* 该类只接收4种类型的返回类型(Long, Boolean, List, or deserialized value type)*/@Autowiredprivate DefaultRedisScript<Boolean> rateLimiterLua;public void limitAccess(String key,Integer limit){//执行lua脚本boolean acquire=redisTemplate.execute(rateLimiterLua,Lists.newArrayList(key),limit.toString());if (!acquire){log.error("your access is blocked,key={}",key);throw new RuntimeException("your access is blocked");}}
}

四、新建config包并创建名为RedisConfiguration的配置类

@Configuration
public class RedisConfiguration {@Beanpublic RedisTemplate<String,String> redisTemplate(RedisConnectionFactory factory){return new StringRedisTemplate(factory);}@Beanpublic DefaultRedisScript loadRedisScript(){DefaultRedisScript redisScript=new DefaultRedisScript();//设置lua脚本redisScript.setLocation(new ClassPathResource("ratelimiter.lua"));//设置返回类型redisScript.setResultType(java.lang.Boolean.class);return redisScript;}
}

五、在resources目录下新建lua脚本文件ratelimiter.lua。

--
-- Created by IntelliJ IDEA.
-- User: wanglei
--
-- 在lua脚本中,有两个全局的变量,是用来接收redis应用端传递的键值和其它参数的,
-- 分别为KEYS、ARGV。-- 在应用端传递给KEYS时是一个数组列表,在lua脚本中通过索引方式获取数组内的值。-- 在应用端,传递给ARGV的参数比较灵活,可以是多个独立的参数,但对应到Lua脚本中是,
-- 统一用ARGV这个数组接收,获取方式也是通过数组下标获取。-- 通过KEYS获取方法签名特征
local methodKey = KEYS[1]
redis.log(redis.LOG_DEBUG, 'key is', methodKey)-- 通过ARGV传入限流大小
local limit = tonumber(ARGV[1])-- 获取当前流量大小
local count = tonumber(redis.call('get', methodKey) or "0")-- 是否超出限流阈值
if count + 1 > limit then-- 拒绝服务访问return false
else-- 没有超过阈值-- 设置当前访问的数量+1redis.call("INCRBY", methodKey, 1)-- 设置过期时间redis.call("EXPIRE", methodKey, 1)-- 放行return true
end

六、在rate_limiter项目中再新建一个ratelimiter_test的子模块用于测试我们前面的脚本。在ratelimiter_test中引入以下依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>${project.groupId}</groupId><artifactId>ratelimiter_annotation</artifactId><version>${project.version}</version>
</dependency>

七、在ratelimiter_test的src/main/java下新建controller包,并在controller包下创建一个TestController的类。

@RestController
@Slf4j
public class TestController {@Autowiredprivate AccessLimiter accessLimiter;@GetMapping("test")public String test(){accessLimiter.limitAccess("ratelimiter-test",1);return "success";}
}

八、在application.properties中添加redis的配置

spring.redis.database=0
spring.redis.host=localhsot
spring.redis.port=6379
spring.redis.password=root

九、创建一个启动类并启动项目,在postman中测试一下查看限流的结果。

@SpringBootApplication
public class RatelimiterTestApplication {public static void main(String[] args) {SpringApplication.run(RatelimiterTestApplication.class, args);}}

十、通过以上的几个步骤,已经实现了基于Redis+Lua的限流,但是代码还不够完美,现在我们将项目改造一下,通过自定义的注解在项目的任何位置都可以实现限流。

先在ratelimiter_annotation模块中引入aop的依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后在ratelimiter_annotation模块中新建一个annotation的包,并在annotation包下创建一个名为AccessLimiter的注解。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AccessLimiter {int limit();String methodKey() default "";
}

再创建一个aspect的包,并创建一个名为AccessLimiterAspect的类

@Slf4j
@Aspect
@Component
public class AccessLimiterAspect {@Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate DefaultRedisScript<Boolean> rateLimiterLua;@Pointcut("@annotation(com.wl.annotation.AccessLimiter)")public void cut(){log.info("cut");}@Before("cut()")public void before(JoinPoint joinPoint){//1、获得方法签名,作为method keyMethodSignature methodSignature= (MethodSignature) joinPoint.getSignature();Method method=methodSignature.getMethod();AccessLimiter annotation=method.getAnnotation(AccessLimiter.class);if (annotation==null){return;}String key=annotation.methodKey();Integer limit=annotation.limit();//如果没有设置methodKey,从调用方法签名自动生成一个if (StringUtils.isEmpty(key)){Class[] type=method.getParameterTypes();key=method.getName();if (type!=null){String paramTypes= Arrays.stream(type).map(Class::getName).collect(Collectors.joining(","));log.info("param types: "+paramTypes);key+="#"+paramTypes;}}//2、调用redisboolean acquire=redisTemplate.execute(rateLimiterLua,Lists.newArrayList(key),limit.toString());if (!acquire){log.error("your access is blocked,key={}",key);throw new RuntimeException("your access is blocked");}}
}

现在我们九可以使用我们自定义的注解了,我们在TestController新增一个方法

@GetMapping("test-annotation")
@com.wl.annotation.AccessLimiter(limit = 1)
public String testAnnotation(){return "success";
}

通过启动类再次启动我们的项目并测试一下testAnnotation接口。

以上就是一对一视频app开发,基于Redis+Lua实现分布式限流, 更多内容欢迎关注之后的文章

http://www.gsyq.cn/news/50221.html

相关文章:

  • 获取cookie的方法不止一种
  • 2025年11月牛初乳品牌口碑榜:五强实测评价与排行指南
  • 完整教程:Vue3与Cesium:轻量版3D地理可视化实践
  • 如何禁用XFCE的屏幕锁
  • 2025年11月消音室厂家推荐榜:五强对比与性能全解析
  • 2025年11月消音室厂家推荐排名榜:五强性能数据与认证资质一览
  • 2025年隔音室厂家联系方式推荐:精选推荐与使用指南
  • Why are monarchies so good
  • 完整教程:算法---位运算
  • 钢管拉弯加工工厂、管桁架加工生产工厂推荐、相贯线切割加工公司排名、钢管弯弧加工厂家、钢管喷漆加工厂家排行榜、钢构件加工工厂哪家好
  • 锅炉风帽厂家/不锈钢锅炉风帽工厂/高温锅炉风帽源头工厂排名/燃煤锅炉风帽厂家推荐/耐热锅炉风帽公司怎么选择/铸铁风帽公司排名/聊城不锈钢风帽厂家排行山东亿诚达金属材料
  • 2025年重庆24小时电脑回收公司权威推荐榜单:闲置电脑回收/i7电脑回收/高价电脑回收源头公司精选
  • 2025年精密仪器搬运公司口碑排行
  • 考研408--计算机网络--day1-概念组成功能三种交换技术分类 - 实践
  • 2025 最新连接器厂家推荐排行榜:涵盖 MDC/ZMDM/J30J/HJ30J 连接器等全系列产品,助力企业精准选型J63A微矩形电连接器,HJ30J系列⾼速传输微矩形电连接器厂家推荐
  • 2025年比较好的工业设备输送线厂家推荐及采购参考
  • 2025年靠谱的自动化输送线厂家推荐及采购指南
  • 当AI遇见塔罗:现代生活中的自我探索新方式
  • 2025年评价高的密集型母线槽厂家最新推荐权威榜
  • 2025年口碑好的衬氟安全阀最新TOP厂家排名
  • 2025年热门的弹簧加载呼吸阀制造厂家
  • Mac上安装Caffeinated 2.0.6.dmg详细步骤|小白也能看懂(附安装包)
  • 2025年靠谱的高精度氯化氢传感器厂家推荐及选择参考
  • 2025年口碑好的法式冷冻薯条市场人气指数榜
  • 2025年质量好的透明打包带厂家实力及用户口碑排行榜
  • 深入解析:论文理解 【LLM-回归】—— Decoding-based Regression
  • DotMemory系列:2. 事件泄露引发的内存暴涨分析
  • 2025 最新曝气器厂家口碑推荐榜:国际权威测评认证,平板 / 管式 / 微孔等全类型优质品牌汇总旋流 / 盘式微孔 / 振动曝气器公司推荐
  • 2025年口碑好的化工厂抗爆墙最新TOP品牌厂家排行
  • 2025年城际出行中巴包车公司排名