一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot項目中接口限流實現(xiàn)方案

SpringBoot項目中接口限流實現(xiàn)方案

2021-03-31 23:12FastCoder Java教程

本篇帶給大家在SpringBoot項目中接口限流實現(xiàn)方案,一般有漏桶算法和令牌桶算法及計數(shù)器三種方式。希望對你有所幫助!

SpringBoot項目中接口限流實現(xiàn)方案

限流算法

一般有漏桶算法和令牌桶算法及計數(shù)器三種方式。

計數(shù)器

用計數(shù)器實現(xiàn)限流有點簡單粗暴,一般我們會限 制一秒鐘的能夠通過的請求數(shù),比如限流QPS為100,算法的實現(xiàn)思路就是從第一個請求進來開始計時,在接下去的1s內(nèi),每來一個請求,就把計數(shù)加1,如果累加的數(shù)字達到了100,那么后續(xù)的請求就會被全部拒絕。等到1s結(jié)束后,把計數(shù)恢復成0,重新開始計數(shù)。

具體的實現(xiàn)可以是這樣的:對于每次服務調(diào)用,可以通過 AtomicLong#incrementAndGet()方法來給計數(shù)器加1并返回最新值,通過這個最新值和閾值進行比較。

這種實現(xiàn)方式,有一個弊端:如果我在單位時間1s內(nèi)的前10ms,已經(jīng)通過了100個請求,那后面的990ms,只能眼巴巴的把請求拒絕,我們把這種現(xiàn)象稱為“突刺現(xiàn)象”。

漏桶算法

漏桶算法主要是控制數(shù)據(jù)注入到網(wǎng)絡的速率,平滑網(wǎng)絡上的突發(fā)流量。漏桶算法提供了一種機制,通過它,突發(fā)流量可以被整形以便為網(wǎng)絡提供一個穩(wěn)定的流量。

漏桶可以看作是一個帶有常量服務時間的單服務器隊列,如果漏桶(包緩存)溢出,那么數(shù)據(jù)包會被丟棄。 在網(wǎng)絡中,漏桶算法可以控制端口的流量輸出速率,平滑網(wǎng)絡上的突發(fā)流量,實現(xiàn)流量整形,從而為網(wǎng)絡提供一個穩(wěn)定的流量。

如圖所示,把請求比作是水,水來了都先放進桶里,并以限定的速度出水,當水來得過猛而出水不夠快時就會導致水直接溢出,即拒絕服務。

SpringBoot項目中接口限流實現(xiàn)方案

image

可以看出,漏桶算法可以很好地控制流量的訪問速度,一旦超過該速度就拒絕服務。

令牌桶算法

令牌桶算法的原理是系統(tǒng)會以一個恒定的速度往桶里放入令牌,而如果請求需要被處理,則需要先從桶里獲取一個令牌,當桶里沒有令牌可取時,則拒絕服務。從原理上看,令牌桶算法和漏桶算法是相反的,一個“進水”,一個是“漏水”。

SpringBoot項目中接口限流實現(xiàn)方案

image

了解完后3種限流算法后,接下來我們看看在項目中如何應用。

  • 使用Google Guava庫RateLimiter

RateLimiter使用的是一種叫令牌桶的流控算法,RateLimiter會按照一定的頻率往桶里扔令牌,線程拿到令牌才能執(zhí)行;且RateLimiter不支持集群環(huán)境,集群環(huán)境需要借助Redis等第三方工具實現(xiàn)。

依賴

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-web</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.     <groupId>com.google.guava</groupId> 
  7.     <artifactId>guava</artifactId> 
  8.     <version>30.1.1-jre</version> 
  9. </dependency> 

實現(xiàn)目標:每秒只允許3個請求通過。

  1. @RestController 
  2. @RequestMapping("/products"
  3. public class ProductController { 
  4.      
  5.     private final RateLimiter rateLimiter = RateLimiter.create(5.0) ; 
  6.      
  7.     @GetMapping("/{id}"
  8.     public ResponseEntity<R> queryProducts(@PathVariable("id")  String id) throws Exception { 
  9.         if (rateLimiter.tryAcquire(1)) { 
  10.             TimeUnit.MILLISECONDS.sleep(200) ; 
  11.             return new ResponseEntity<R>(R.success("查詢商品【" + id + "】成功"), HttpStatus.OK) ; 
  12.         } 
  13.         return new ResponseEntity<R>(R.failure("你訪問的太快了"), HttpStatus.INTERNAL_SERVER_ERROR) ; 
  14.     } 

通過Jmeter測試,版本5.4.1

線程配置,100個并發(fā)循環(huán)2次

SpringBoot項目中接口限流實現(xiàn)方案

接口配置

SpringBoot項目中接口限流實現(xiàn)方案

測試結(jié)果

SpringBoot項目中接口限流實現(xiàn)方案

RateLimiter相關方法說明:

SpringBoot項目中接口限流實現(xiàn)方案

參考https://ifeve!com/guava-ratelimiter

  • 使用百度的ratelimiter-spring-boot-starter

ratelimiter-spring-boot-starter為服務端限流的SDK,提供單節(jié)點維度的限流功能,通過限流算法,在流量過大時保證服務端按照一定速率平滑處理請求。

基于Spring Boot框架開發(fā),目的是為Spring Cloud項目增加限流功能,同樣在Spring Boot項目中也能正常使用。 本Starter的目前的應用場景為在Spring Cloud/Spring Boot的Web項目中引入該限流Starter,配置限流規(guī)則開啟限流功能。 非Spring Web項目的特性正在規(guī)劃中。

限流維度為:節(jié)點級、方法維度、服務維度限流。

  • 節(jié)點級別含義為限流SDK引入目標服務代碼,限流規(guī)則針對目標服務部署的每個實例單獨生效。
  • 方法維度含義為可以為目標服務的每個方法單獨配置限流規(guī)則,該規(guī)則針對當前方法生效,與其他方法互不影響,目前方法僅支持HttpMethod+uri。
  • 服務維度含義為可針對每個服務實例配置全局規(guī)則,流入該服務實例的每個請求都將先進行服務限流判斷。 服務級和方法級同時存在,將先后進過服務級、方法級兩種限流器,任意一個限流器拒絕都將拒絕請求。

目前方法級只提供http方法的規(guī)則配置與生效,后續(xù)有計劃支持Rpc方法的限流。

依賴

  1. <dependency> 
  2.         <groupId>com.baidubce.formula</groupId> 
  3.         <artifactId>ratelimiter-spring-boot-starter</artifactId> 
  4.         <version>2.1.1.1</version> 
  5. </dependency> 

應用配置

  1. spring: 
  2.   application: 
  3.     name: ratelimiter 
  4. --- 
  5. formula: 
  6.   ratelimiter: 
  7.     enabled: true 
  8.     ratelimiters: 
  9.     # 限流生效的位置,配置具體的uri 
  10.     - effectiveLocation: /products/q/** 
  11.       # 限流類型:1表示http,2表示rpc(暫未支持) 
  12.       effectiveType: 1 
  13.       # 該規(guī)則是否生效 
  14.       enabled: true 
  15.       httpMethod: GET 
  16.       # 限流器類型,1表示令牌桶 
  17.       limiterType: 1 
  18.       # 請求來源,當前版本不區(qū)分請求來源,區(qū)分請求來源的需求正在開發(fā) 
  19.       # source: 
  20.       # 限流的QPS值 
  21.       threshold: 5 

注意:這里的spring.application.name必須配置,不然啟動報錯;

formula.ratelimiter.ratelimiters.source這個沒有搞懂怎么配置的,官方文檔沒找到。

接口

  1. @GetMapping("/q/{id}"
  2. public ResponseEntity<R> queryProduct(@PathVariable("id")  String id) throws Exception { 
  3.         TimeUnit.MILLISECONDS.sleep(200) ; 
  4.         return new ResponseEntity<R>(R.success("查詢商品【" + id + "】成功"), HttpStatus.OK) ; 

測試

SpringBoot項目中接口限流實現(xiàn)方案

對于失敗的請求,返回狀態(tài)碼429(Too Many Request)

baidu的這個限流工具,核心過濾器:

RateLimiterEffectiveFilter.java

SpringBoot項目中接口限流實現(xiàn)方案

waitForPermit方法

SpringBoot項目中接口限流實現(xiàn)方案

waitForPermission方法

SpringBoot項目中接口限流實現(xiàn)方案

HttpUtil#isBlockException方法

SpringBoot項目中接口限流實現(xiàn)方案

看到這里你想修改返回信息只能是重寫它的代碼了。

重寫該類:

在我們項目src新建

com.baidu.formula.ratelimiter.spring.boot.autoconfigure.util.HttpUtil類修改isBlockException方法

  1. public static boolean isBlockException(HttpServletResponse response, Exception e) throws IOException { 
  2.         if (e instanceof BlockException) { 
  3.             response.setStatus(429); // too many request 
  4.             response.setContentType("application/json; charset=utf-8"); 
  5.             response.setCharacterEncoding("UTF-8"); 
  6.             response.getWriter().print("{\"code\": -1, \"message\": \"你的請求太快了\"}") ; 
  7.             response.flushBuffer(); 
  8.             return true
  9.         } else { 
  10.             return false
  11.         } 

測試:

SpringBoot項目中接口限流實現(xiàn)方案

完畢!!!

原文地址:https://www.toutiao.com/i6943481208714084902/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 性夜影院午夜看片 | 男同志与动人物zozotv | 四虎影视4hu最新地址在线884 | 体检小说 | 亚洲高清网站 | 亚洲性综合网 | 天海翼最新作品 | 日韩精品视频福利资源站 | 91粉色视频在线导航 | 胖女性大bbbbbb | 小草视频免费观看在线 | julia ann一hd | 9久热久爱免费精品视频在线观看 | 天堂俺去俺来也www久久婷婷 | 亚洲春黄在线观看 | 免费老外的毛片清高 | 扒开女人下面使劲桶屁股动漫 | 欧美一级视 | 亚洲haose在线观看 | 国产日韩免费视频 | 精品国产成人AV在线看 | 亚洲欧美精品一区二区 | 午夜办公室在线观看高清电影 | a级情欲片在线观看hd | 欧美一区二区三区免费不卡 | 精品国产mmd在线观看 | 紧身裙女教师波多野结衣 | 国产精品视频视频久久 | 情欲满载2012美国dvd | 亚洲第一天堂无码专区 | chinesespanking网站 | 四虎影视4hutv最新地址在线 | 99热久久这里只有精品6国产网 | 亚洲高清国产品国语在线观看 | 草草视频免费看 | 亚洲天堂精品在线 | 91传媒制片厂制作传媒破解版 | 男人天堂a | 日韩小视频在线观看 | 岛国不卡| 欧美国产日本高清不卡 |