目錄
guava使用
幾個限流講解
令牌桶和漏桶差別
令牌桶原理
漏桶算法原理
服務熔斷
服務降級
首先目前主流限流架構底層都是用的令牌桶或漏桶算法。
guava使用
pom
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
令牌桶限流 - RateLimiter,一秒處理0.5個請求
限流代碼寫在網關層
// 1秒處理0.5個請求,2秒處理1個請求 -- 原理:令牌桶儲存在記憶體當中
private final static RateLimiter rateLimiter = RateLimiter.create(0.5);
@ResponseBody
@RequestMapping("toIndex")
public String toIndexHtml(){
// 擷取令牌
boolean tryAcquire = rateLimiter.tryAcquire();
if(!tryAcquire){ // 限流
return "請稍後通路...";
}else{ // 正常
log.info("ok");
}
}
幾個限流講解
令牌桶和漏桶差別
漏桶
漏桶的出水速度是固定的,那麼意味着如果瞬時大流量的話,将有大部分請求被丢棄掉(也就是所謂的溢出)。
令牌桶
生成令牌的速度是固定的,而請求去拿令牌是沒有速度限制的。這意味,面對瞬時大流量,該算法可以在短時間内請求拿到大量令牌,而且拿令牌的過程并不是消耗很大的事情。
最後
不論是對于令牌桶拿不到令牌被拒絕,還是漏桶的水滿了溢出,都是為了保證大部分流量的正常使用,而犧牲掉了少部分流量,這是合理的,如果因為極少部分流量需要保證的話,那麼就可能導緻系統達到極限而挂掉,得不償失。
令牌桶原理
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLzcGRPh3ZE9kMNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxcDO1ATN1gDM2ATOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)