在Java项目中使用接口限流通常是为了保护系统免受过度请求的影响,以及防止资源被滥用。以下是一些适合进行接口限流的情况,以及相应的例子:
系统安全的实现
- 频繁访问的接口:对于一些被频繁访问的接口,如登录接口、注册接口等,限制频率可以有效地防止恶意攻击或者过度消耗系统资源。
@RestController
public class LoginController {
private RateLimiter loginRateLimiter = RateLimiter.create(10); // Allow 10 requests per second
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody LoginRequest request) {
if (loginRateLimiter.tryAcquire()) {
// Process login request
return ResponseEntity.ok("Login successful");
} else {
return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("Too many requests");
}
}
}
- 高性能但资源密集型的接口:一些接口可能是高性能但资源密集型的,比如查询大量数据的接口。通过限制并发访问量,可以防止系统负载过高。
@RestController
public class DataController {
private Semaphore dataAccessSemaphore = new Semaphore(100); // Allow 100 concurrent requests
@GetMapping("/data")
public ResponseEntity<List<Data>> getData() {
try {
dataAccessSemaphore.acquire();
// Process data request
return ResponseEntity.ok(data);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
} finally {
dataAccessSemaphore.release();
}
}
}
- 与外部服务通信的接口:如果你的应用程序需要频繁地调用外部服务,为了避免过度依赖这些服务或者因为过多请求而导致服务降级,可以限制访问频率。
public class ExternalServiceClient {
private RateLimiter apiRateLimiter = RateLimiter.create(5); // Allow 5 requests per second
public String callExternalService() {
if (apiRateLimiter.tryAcquire()) {
// Make API call
return "Response from external service";
} else {
throw new RateLimitExceededException("Rate limit exceeded for external service");
}
}
}
- 特定业务场景下的接口:根据具体的业务场景,可能有一些特定的接口需要被限流,比如用户充值、订单提交等。
接口限流实现Guava RateLimiter
Guava是Google提供的一套Java开发库,其中包含了许多实用的工具和扩展类。Guava中的限流器(RateLimiter)是一种方便的工具,用于控制特定操作或资源的访问速率。它基于令牌桶算法实现,可以限制在一定时间内可执行操作的数量,从而保护系统资源免受过度请求的影响。
以下是Guava限流器的一些关键特点和用法:
-
稳定性和高性能:Guava限流器经过优化,具有高性能和稳定的特性,适用于高并发的应用场景。
-
基于令牌桶算法:Guava限流器基于令牌桶算法,它会定期向桶中添加令牌,表示可执行操作的数量。令牌的添加速率决定了操作的执行速率。
-
支持平滑突发限流:Guava限流器支持平滑突发限流(SmoothBursty)和平滑预热限流(SmoothWarmingUp)两种模式。平滑突发限流模式下,请求可以突发到一定的数量,但之后将稳定在设定的速率上。
-
简单易用的API:Guava限流器提供了简单易用的API,可以轻松地创建和使用限流器实例。
总之,接口限流应该根据具体的业务需求和系统特点进行定制。要确保合适的限流策略应用于真正需要保护的接口,以平衡系统的稳定性和性能。
参考博客:
https://zhuanlan.zhihu.com/p/60979444?utm_id=0https://zhuanlan.zhihu.com/p/60979444?utm_id=0