真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

這篇文章將為大家詳細(xì)講解有關(guān)SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供蘆山企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、HTML5建站、小程序制作等業(yè)務(wù)。10年已為蘆山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

限流算法

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

計(jì)數(shù)器

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

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

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

漏桶算法

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

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

如圖所示,把請求比作是水,水來了都先放進(jìn)桶里,并以限定的速度出水,當(dāng)水來得過猛而出水不夠快時(shí)就會(huì)導(dǎo)致水直接溢出,即拒絕服務(wù)。

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

image

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

令牌桶算法

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

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

image

了解完后3種限流算法后,接下來我們看看在項(xiàng)目中如何應(yīng)用。

  • 使用Google Guava庫RateLimiter

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

依賴

     org.springframework.boot     spring-boot-starter-web       com.google.guava     guava     30.1.1-jre 

實(shí)現(xiàn)目標(biāo):每秒只允許3個(gè)請求通過。

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

通過Jmeter測試,版本5.4.1

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

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

接口配置

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

測試結(jié)果

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

RateLimiter相關(guān)方法說明:

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

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

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

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

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

限流維度為:節(jié)點(diǎn)級、方法維度、服務(wù)維度限流。

  • 節(jié)點(diǎn)級別含義為限流SDK引入目標(biāo)服務(wù)代碼,限流規(guī)則針對目標(biāo)服務(wù)部署的每個(gè)實(shí)例單獨(dú)生效。

  • 方法維度含義為可以為目標(biāo)服務(wù)的每個(gè)方法單獨(dú)配置限流規(guī)則,該規(guī)則針對當(dāng)前方法生效,與其他方法互不影響,目前方法僅支持HttpMethod+uri。

  • 服務(wù)維度含義為可針對每個(gè)服務(wù)實(shí)例配置全局規(guī)則,流入該服務(wù)實(shí)例的每個(gè)請求都將先進(jìn)行服務(wù)限流判斷。  服務(wù)級和方法級同時(shí)存在,將先后進(jìn)過服務(wù)級、方法級兩種限流器,任意一個(gè)限流器拒絕都將拒絕請求。

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

依賴

         com.baidubce.formula         ratelimiter-spring-boot-starter         2.1.1.1 

應(yīng)用配置

spring:   application:     name: ratelimiter --- formula:   ratelimiter:     enabled: true     ratelimiters:     # 限流生效的位置,配置具體的uri     - effectiveLocation: /products/q/**       # 限流類型:1表示http,2表示rpc(暫未支持)       effectiveType: 1       # 該規(guī)則是否生效       enabled: true       httpMethod: GET       # 限流器類型,1表示令牌桶       limiterType: 1       # 請求來源,當(dāng)前版本不區(qū)分請求來源,區(qū)分請求來源的需求正在開發(fā)       # source:       # 限流的QPS值       threshold: 5

注意:這里的spring.application.name必須配置,不然啟動(dòng)報(bào)錯(cuò);

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

接口

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

測試

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

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

baidu的這個(gè)限流工具,核心過濾器:

RateLimiterEffectiveFilter.java

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

waitForPermit方法

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

waitForPermission方法

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

HttpUtil#isBlockException方法

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

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

重寫該類:

在我們項(xiàng)目src新建

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

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

測試:

SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流

關(guān)于SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。


分享題目:SpringBoot項(xiàng)目中怎么實(shí)現(xiàn)接口限流
文章URL:http://weahome.cn/article/pesjgd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部