爲何有這篇文章
在負責某個項目開發過程當中,在定時任務(job)裏面調用了公司的內部某個微服務,進行財務流水生成,在被調用方能力處理不及時的時候,引起被調用方宕機奔潰,故此在客戶端,即Job作簡單的限流,因而針對此場景進行調研,發現Guava RateLimiter在此種場景下,簡單且高效。
模擬調用示例
public static void main(String[] args) {
// 模擬10次調用
int a = 10;
while (true) {
// 調用的當前時間
LocalTime now = LocalTime.now();
System.out.println("模擬調用三方微服務,當前時間爲:" + now.toString());
a--;
if (a == 0) {
break;
}
}
}
模擬調用三方微服務,當前時間爲:10:16:22.088
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
模擬調用三方微服務,當前時間爲:10:16:22.089
由本示例能夠了解到,在 10:16:22 內完成了 10次調用,本次調用過程當中對於調用方的併發處理能力要求很高,若是調用方沒有作限流等操做的話,在業務高峯期,調用方很容易崩潰,固然咱們若是做爲調用方的話,也須要作簡單的限流操做:推薦使用 sentine
https://sentinelguard.io/zh-cn/docs/open-source-framework-integrations.html
客戶端調用按照RateLimiter限流限流示例
public static void main(String[] args) {
//初始化 每秒1個令牌
RateLimiter rateLimiter = RateLimiter.create(1);
int a = 10;
while (true) {
//每次須要1個令牌
rateLimiter.acquire(1);
LocalTime now = LocalTime.now();
System.out.println("模擬調用三方微服務,當前時間爲:" + now.toString());
a--;
if (a == 0) {
break;
}
}
}
模擬調用三方微服務,當前時間爲:10:24:10.257
模擬調用三方微服務,當前時間爲:10:24:11.176
模擬調用三方微服務,當前時間爲:10:24:12.177
模擬調用三方微服務,當前時間爲:10:24:13.177
模擬調用三方微服務,當前時間爲:10:24:14.180
模擬調用三方微服務,當前時間爲:10:24:15.180
模擬調用三方微服務,當前時間爲:10:24:16.175
模擬調用三方微服務,當前時間爲:10:24:17.180
模擬調用三方微服務,當前時間爲:10:24:18.179
模擬調用三方微服務,當前時間爲:10:24:19.177
咱們能夠看到限流後的服務調用記錄,在10-19秒內,每秒調用一次,服務調用平穩,並沒有瞬時的高峯,緩解了調用方的服務壓力,不會平白無故背鍋。
RateLimiter源碼分析
持續更新中....