我们可以使用策略模式来统一单机限流和分布式限流的实现,提高代码的可扩展性和可维护性。
思路是定义一个 RateLimitStrategy
接口,并分别实现单机限流策略 LocalRateLimitStrategy
和分布式限流策略 DistributedRateLimitStrategy
。在 AOP 切面中,根据配置决定使用哪种限流策略。
定义策略接口
public interface RateLimitStrategy {
boolean tryAcquire(String key, double qps, long timeout, TimeUnit timeUnit);
}
实现单机限流策略
import com.google.common.util.concurrent.RateLimiter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class LocalRateLimitStrategy implements RateLimitStrategy {
private final Map<String, RateLimiter> rateLimiters = new ConcurrentHashMap<>();
@Override
public boolean tryAcquire(String key, double qps, long timeout, TimeUnit timeUnit) {
RateLimiter limiter = rateLimiters.computeIfAbsent(key, k -> RateLimiter.create(qps));
if (timeout > 0