一、测试环境
(1) MySQL服务器一台
(2)应用系统
(3)JMeter压力测试工具
测试结果
  系统并发数量与响应时间
 
| 并发数量 | 响应时间 | 
| 10 | 44ms | 
| 50 | 253ms | 
| 100 | 4.4s | 
| 200 | 29.77s | 
| 更多... | 系统渐渐无响应 | 
系统在并发量逐渐增加后,系统渐渐不可用,最后变成无响应,可以模拟出线上已经宕机。
如何才能保护我们的系统,防止在缓存击穿后保护我们的数据库系统呢?
可以使用限流办法来解决。
二、限流组件
RateLimiter组件
谷歌的RateLimter组件 能够 每X秒发放N个令牌,只有拿到令牌的线程才能访问接口。
特别注意RateLimiter是单机的,也就是说它无法跨JVM使用。单机部署可以考虑使用。
import com.google.common.util.concurrent.RateLimiter;
@RestController
public class UserController ...
//每秒发放2个令牌,意味着每秒最多有2个线程进入接口
private static RateLimiter rateLimiter = RateLimiter.create(2);
@GetMapping(value = "/get")
public UserDO getById(String id) throws InterruptedException {
if (rateLimiter.tryAcquire()) {
return userService.getById(id);
}
return null;
}










