All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.dengchen2020.ratelimiter.config.DistributedRateLimiterAutoConfiguration Maven / Gradle / Ivy

There is a newer version: 0.0.28
Show newest version
package io.github.dengchen2020.ratelimiter.config;

import io.github.dengchen2020.ratelimiter.distributed.DistributedRateLimiterAop;
import io.github.dengchen2020.ratelimiter.properties.RateLimiterBuilder;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

import java.util.concurrent.Executors;

/**
 * 分布式限流自动配置
 *
 * @author dengchen
 * @since 2024/7/1
 */
@ConditionalOnClass(RedissonClient.class)
@ConditionalOnProperty(value = "dc.ratelimiter.type",havingValue = "distributed")
@EnableConfigurationProperties(RateLimiterBuilder.class)
@Configuration(proxyBeanMethods = false)
public class DistributedRateLimiterAutoConfiguration {

    @ConditionalOnProperty(value = "dc.ratelimiter.enable", matchIfMissing = true, havingValue = "true")
    @ConditionalOnMissingBean
    @Bean(destroyMethod = "shutdown")
    public RedissonClient redisson(@Value("${spring.data.redis.host}") String host, @Value("${spring.data.redis.port:6379}") String port, @Value("${spring.data.redis.password}") String password, @Value("${spring.data.redis.database:0}") int database, @Value("${spring.data.redis.username:#{null}}") String username) {
        Config config = new Config();
        config.setExecutor(Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("dc-redisson-", 0).factory()));
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig.setKeepAlive(true).setAddress("redis://" + host + ":" + port).setPassword(password).setDatabase(database);
        if(StringUtils.hasText(username)) singleServerConfig.setUsername(username);
        config.setUseScriptCache(true);
        return Redisson.create(config);
    }

    @ConditionalOnProperty(value = "dc.ratelimiter.enable", matchIfMissing = true, havingValue = "true")
    @ConditionalOnBean(RedissonClient.class)
    @Bean
    public DistributedRateLimiterAop distributedRateLimiterAop(RedissonClient redissonClient){
        return new DistributedRateLimiterAop(redissonClient);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy