java 如何限制请求
限制请求的方法
使用限流算法 令牌桶算法或漏桶算法可以有效控制请求速率。Guava库中的RateLimiter类提供了基于令牌桶的实现,适合单机限流。
RateLimiter limiter = RateLimiter.create(10.0); // 每秒10个请求
if (limiter.tryAcquire()) {
// 处理请求
} else {
// 拒绝请求
}
分布式限流 Redis结合Lua脚本可以实现分布式环境下的限流,避免单点限流失效问题。通过INCR和EXPIRE命令组合实现计数器限流。

// Redis Lua脚本示例
String luaScript = "local current = redis.call('incr', KEYS[1]); " +
"if current == 1 then redis.call('expire', KEYS[1], ARGV[1]) end; " +
"return current <= tonumber(ARGV[2])";
Web框架中间件 Spring Boot可通过拦截器或过滤器实现限流,结合注解方式灵活控制不同接口的限流策略。
@Aspect
@Component
public class RateLimitAspect {
private ConcurrentHashMap<String, RateLimiter> limiters = new ConcurrentHashMap<>();
@Around("@annotation(limit)")
public Object around(ProceedingJoinPoint pjp, RateLimit limit) throws Throwable {
RateLimiter limiter = limiters.computeIfAbsent(
getMethodSignature(pjp),
k -> RateLimiter.create(limit.value())
);
if (!limiter.tryAcquire()) {
throw new RuntimeException("Too many requests");
}
return pjp.proceed();
}
}
服务网格限流 Istio等Service Mesh方案提供全局限流能力,通过配置DestinationRule实现无需代码修改的限流。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: productpage
spec:
host: productpage
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http2MaxRequests: 1000
maxRequestsPerConnection: 10
outlierDetection:
consecutiveErrors: 7
interval: 5m
baseEjectionTime: 15m
自适应限流 根据系统负载动态调整限流阈值,如Netflix的ConcurrencyLimiter。结合CPU、内存等指标实时计算当前最大可处理请求数。
// 伪代码示例
double maxQps = calculateMaxQpsBasedOnSystemMetrics();
if (currentQps > maxQps * 0.8) {
enableDegradedMode();
}
熔断降级机制 Hystrix或Resilience4j等库提供的熔断器模式可以在异常增多时自动拒绝请求,防止系统雪崩。
CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults("backendService");
Supplier<String> decoratedSupplier = CircuitBreaker
.decorateSupplier(circuitBreaker, backendService::doSomething);






