小工具知识网

当前位置: 首页 > 行业知识 > Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截

行业知识

Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截

2026-10-19 22:11:48 来源:互联网转载

️个人主页:���着猫散步的鼠鼠 

️系列专栏:Java全栈-专栏

️个人学习笔记,若有缺误,欢迎评论区指正 

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站AI学习网站。

目录

前言

1.导入Redisson

引入依赖

编写配置

声明Redisson客户端Bean

2.自定义注解

3.AOP切面编程

导入依赖

编写AOP限流代码

4.接口使用自定义注解实现限流

使用自定义限流注解

绑定限流回调函数

总结


前言

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。  限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待

我们上次讲解了如何使用Sentinel来实现服务限流,今天我们来讲解下如何使用Redisson+AOP+自定义注解+反射优雅的实现服务限流,本文讲解的限流实现支持针对用户IP限流,整个接口的访问限流,以及对某个参数字段的限流,并且支持请求限流后处理回调

1.导入Redisson

引入依赖

我们首先导入Redisson所需要的依赖,我们这里的springboot版本为2.7.12

   org.redisson   redisson-spring-boot-starter   3.23.4

编写配置

# Redisson客户端redis:  sdk:    config:      host: redis服务IP      port: 6379      password: redis密码,没有可删掉这行      pool-size: 10      min-idle-size: 5      idle-timeout: 30000      connect-timeout: 5000      retry-attempts: 3      retry-interval: 1000      ping-interval: 60000      keep-alive: true

声明Redisson客户端Bean

配置映射类RedisCientConfigProperties

@Data@ConfigurationProperties(prefix = "redis.sdk.config", ignoreInvalidFields = true)public class RedisCientConfigProperties {    /** host:ip */    private String host;    /** 端口 */    private int port;    /** 账密 */    private String password;    /** 设置连接池的大小,默认为64 */    private int poolSize = 64;    /** 设置连接池的最小空闲连接数,默认为10 */    private int minIdleSize = 10;    /** 设置连接的最大空闲时间(单位:毫秒),超过该时间的空闲连接将被关闭,默认为10000 */    private int idleTimeout = 10000;    /** 设置连接超时时间(单位:毫秒),默认为10000 */    private int connectTimeout = 10000;    /** 设置连接重试次数,默认为3 */    private int retryAttempts = 3;    /** 设置连接重试的间隔时间(单位:毫秒),默认为1000 */    private int retryInterval = 1000;    /** 设置定期检查连接是否可用的时间间隔(单位:毫秒),默认为0,表示不进行定期检查 */    private int pingInterval = 0;    /** 设置是否保持长连接,默认为true */    private boolean keepAlive = true;}
Configuration@EnableConfigurationProperties(RedisCientConfigProperties.class)public class RedisClientConfig {    @Bean("redissonClient")    public RedissonClient redissonClient(ConfigurableApplicationContext applicationContext, RedisCientConfigProperties properties) {        Config config = new Config();        // 根据需要可以设定编解码器;https://github.com/redisson/redisson/wiki/4.-%E6%95%B0%E6%8D%AE%E5%BA%8F%E5%88%97%E5%8C%96        // config.setCodec(new RedisCodec());        config.useSingleServer()                .setAddress("redis://" + properties.getHost() + ":" + properties.getPort())               .setPassword(properties.getPassword())                .setConnectionPoolSize(properties.getPoolSize())                .setConnectionMinimumIdleSize(properties.getMinIdleSize())                .setIdleConnectionTimeout(properties.getIdleTimeout())                .setConnectTimeout(properties.getConnectTimeout())                .setRetryAttempts(properties.getRetryAttempts())                .setRetryInterval(properties.getRetryInterval())                .setPingConnectionInterval(properties.getPingInterval())                .setKeepAlive(properties.isKeepAlive())        ;        RedissonClient redissonClient = Redisson.create(config);        // 注册消息发布订阅主题Topic        // 找到所有实现了Redisson中MessageListener接口的bean名字        String[] beanNamesForType = applicationContext.getBeanNamesForType(MessageListener.class);        for (String beanName : beanNamesForType) {            // 通过bean名字获取到监听bean            MessageListener bean = applicationContext.getBean(beanName, MessageListener.class);            Class

上一篇:进口美白祛斑产品需要国家备案吗

下一篇:元素之诗服务器怎么玩?