「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
-
SpringCloud的限流zuul
-
令牌桶:
想象有一个木桶,系统按照固定速率,例如10ms每次,往桶里加入Token,如果桶已经满了就不再添加。新请求来临时,会各自拿走一个Token,如果没有Token 就拒绝服务。这里如果一段时间没有请求时,桶内就会积累一些token,下次一旦有突发流量,只要token足够,也能一次处理。
总结下令牌桶算法的特点,令牌桶即可以控制进入系统的请求请求量,同时允许突发流
-
漏桶
限定流出的速度,请求放到桶里面去,如果满了,就终止服务。
-
使用guava的RateLimiter类---只能单机使用,因为这个类只存在这个服务器上。redis集群部署(也是一主多从)会保证全局一致性。
RateLimiter.tryAcquire(时间),等待获取令牌如果超过一定时间就结束请求。
RateLimiter.acquire(),获取令牌。
-
**漏桶和令牌桶的区别:**从上面的例子估计大家也能看出来了,漏桶只能以固定的速率去处理请求,而令牌桶可以以桶子最大的令牌数去处理请求
-
redis实现:
hmset rateLimit last_ms 20 -- 最后时间毫秒 now_permits 20 -- 当前可用的令牌 max_permits 40 -- 令牌桶最大数量 rate 10 --1ms生成多少个令牌 lua的逻辑是: if(last_ms == null){ // 如果没有记录上一次操作的时间 那么就是第一次请求 now_permits = max_permits - 1; // 初始化40个数量 last_ms = CURRENT_TIME; } else { // 获取一个token now_permits = (CURRENT_TIME - last_ms) * 1000 * rate + now_permits; now_permits = Math.min(now_permits,max_permits); if(now_permits <=0 ) { return false; } now_permits--; return true ; } -
redis的缓存击穿
key过期了,然后大量的请求进来。
-
分布式和集群:
集群就是一台机干不了,我就搞两台机。--nginx进行负载均衡
分布式是微服务,一个业务拆分成多个业务,分布在不同的服务器上。