亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解Spring Cloud Netflix Zuul中的速率限制

2024-07-14 08:42:48
字體:
來源:轉載
供稿:網友

Spring Cloud Netflix Zuul是一個包含Netflix Zuul的 開源網關。它為Spring Boot應用程序添加了一些特定功能。不幸的是,開箱即用不提供速率限制。

除了Spring Cloud Netflix Zuul依賴項之外,我們還需要將Spring Cloud Zuul RateLimit 添加到我們的應用程序的pom.xml中:

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><dependency> <groupId>com.marcosbarbero.cloud</groupId> <artifactId>spring-cloud-zuul-ratelimit</artifactId> <version>2.2.0.RELEASE</version></dependency>

首先,讓我們創建幾個REST端點,我們將在其上應用速率限制。

下面是一個簡單的Spring Controller類,有兩個端點:

@Controller@RequestMapping("/greeting")public class GreetingController {  @GetMapping("/simple") public ResponseEntity<String> getSimple() {  return ResponseEntity.ok("Hi!"); }  @GetMapping("/advanced") public ResponseEntity<String> getAdvanced() {  return ResponseEntity.ok("Hello, how you doing?"); }}

讓我們在application.yml文件中添加以下Zuul屬性  :

zuul: routes: serviceSimple:  path: /greeting/simple  url: forward:/ serviceAdvanced:  path: /greeting/advanced  url: forward:/ ratelimit: enabled: true repository: JPA policy-list:  serviceSimple:  - limit: 5   refresh-interval: 60   type:   - origin  serviceAdvanced:  - limit: 1   refresh-interval: 2   type:   - origin strip-prefix: true

在zuul.routes下,我們提供端點詳細信息。在zuul.ratelimit.policy-list下,我們為端點提供速率限制配置。該限屬性指定的時間端點可以在內部被稱為數字刷新間隔。

我們可以看到,我們為serviceSimple  端點添加了每60秒5個請求的速率限制。相比之下,  serviceAdvanced的速率限制為每2秒1個請求。

該類型配置指定其速率限制的方法,以下是可能的值:

  • origin - 基于用戶原始請求的速率限制
  • url - 基于下游服務的請求路徑的速率限制
  • user - 基于經過身份驗證的用戶名或“匿名”的速率限制
  • No value - 充當每項服務的全局配置。要使用這種方法,請不要設置參數'type'

接下來,讓我們測試一下速率限制:

@Testpublic void whenRequestNotExceedingCapacity_thenReturnOkResponse() { ResponseEntity<String> response = restTemplate.getForEntity(SIMPLE_GREETING, String.class); assertEquals(OK, response.getStatusCode());  HttpHeaders headers = response.getHeaders(); String key = "rate-limit-application_serviceSimple_127.0.0.1";  assertEquals("5", headers.getFirst(HEADER_LIMIT + key)); assertEquals("4", headers.getFirst(HEADER_REMAINING + key)); assertEquals("60000", headers.getFirst(HEADER_RESET + key)); }

在這里,我們只對一個端點/ greeting / simple進行一次調用。請求成功,因為它在速率限制內。

另一個關鍵點是,對于每個響應,我們返回標頭Header,為我們提供有關速率限制的更多信息。對于上述請求,我們將獲得以下標頭:

X-RateLimit-Limit-rate-limit-application_serviceSimple_127.0.0.1: 5X-RateLimit-Remaining-rate-limit-application_serviceSimple_127.0.0.1: 4X-RateLimit-Reset-rate-limit-application_serviceSimple_127.0.0.1: 60000

解釋:

  • X-RateLimit-Limit- [key]:為端點配置 的限制
  • X-RateLimit-Remaining- [key]:  調用端點的剩余嘗試次數
  • X-RateLimit-Reset- [key]:為端點配置 的刷新間隔的剩余毫秒數

另外,如果我們再次立即觸發相同的端點,我們可以得到:

X-RateLimit-Limit-rate-limit-application_serviceSimple_127.0.0.1: 5X-RateLimit-Remaining-rate-limit-application_serviceSimple_127.0.0.1: 3X-RateLimit-Reset-rate-limit-application_serviceSimple_127.0.0.1: 57031

請注意減少的剩余嘗試次數和剩余的毫秒數。

讓我們看看當我們超過速率限制時會發生什么:

@Testpublic void whenRequestExceedingCapacity_thenReturnTooManyRequestsResponse() throws InterruptedException { ResponseEntity<String> response = this.restTemplate.getForEntity(ADVANCED_GREETING, String.class); assertEquals(OK, response.getStatusCode());   for (int i = 0; i < 2; i++) {  response = this.restTemplate.getForEntity(ADVANCED_GREETING, String.class); }  assertEquals(TOO_MANY_REQUESTS, response.getStatusCode());  HttpHeaders headers = response.getHeaders(); String key = "rate-limit-application_serviceAdvanced_127.0.0.1";  assertEquals("1", headers.getFirst(HEADER_LIMIT + key)); assertEquals("0", headers.getFirst(HEADER_REMAINING + key)); assertNotEquals("2000", headers.getFirst(HEADER_RESET + key));  TimeUnit.SECONDS.sleep(2);  response = this.restTemplate.getForEntity(ADVANCED_GREETING, String.class); assertEquals(OK, response.getStatusCode());}

在這里,我們快速連續兩次調用,由于我們已將速率限制配置為每2秒一個請求,因此第二個調用將失敗。結果,錯誤代碼429(Too Many Requests)返回給客戶端。以下是達到速率限制時返回的標頭:

X-RateLimit-Limit-rate-limit-application_serviceAdvanced_127.0.0.1: 1X-RateLimit-Remaining-rate-limit-application_serviceAdvanced_127.0.0.1: 0X-RateLimit-Reset-rate-limit-application_serviceAdvanced_127.0.0.1: 268

之后,我們休息了2秒鐘。這是為端點配置的刷新間隔。最后,我們再次觸發端點并獲得成功的響應。

自定義密鑰生成器

我們可以使用自定義密鑰生成器自定義響應頭中發送的密鑰。這很有用,因為應用程序可能需要控制除type屬性提供的選項之外的密鑰策略。

例如,這可以通過創建自定義的RateLimitKeyGenerator實現類來完成。我們可以添加更多的限定符或完全不同的東西:

@Beanpublic RateLimitKeyGenerator rateLimitKeyGenerator(RateLimitProperties properties, RateLimitUtils rateLimitUtils) { return new DefaultRateLimitKeyGenerator(properties, rateLimitUtils) {  @Override  public String key(HttpServletRequest request, Route route,   RateLimitProperties.Policy policy) {   return super.key(request, route, policy) + "_" + request.getMethod();  } };}

上面的代碼將REST方法名稱附加到鍵。例如:

X-RateLimit-Limit-rate-limit-application_serviceSimple_127.0.0.1_GET: 5

另一個關鍵點是  RateLimitKeyGenerator bean將由spring-cloud-zuul-ratelimit自動配置。

自定義錯誤處理

該框架支持速率限制數據存儲的各種實現。例如,提供了Spring Data JPA和Redis。默認情況下,使用DefaultRateLimiterErrorHandler  類將故障記錄為錯誤。

當我們需要以不同方式處理錯誤時,我們可以定義一個自定義的RateLimiterErrorHandler bean:

@Beanpublic RateLimiterErrorHandler rateLimitErrorHandler() { return new DefaultRateLimiterErrorHandler() {  @Override  public void handleSaveError(String key, Exception e) {   <i>// implementation</i>  }   @Override  public void handleFetchError(String key, Exception e) {   <i>// implementation</i>  }   @Override  public void handleError(String msg, Exception e) {   <i>// implementation</i>  } };}

與RateLimitKeyGenerator bean 類似  ,也將自動配置RateLimiterErrorHandler bean。

在GitHub上 找到本文的完整代碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影免费观看| 欧美日韩亚洲一区二区三区| 97在线日本国产| 欧美最近摘花xxxx摘花| 亚洲亚裔videos黑人hd| 日韩在线观看免费高清完整版| 国产小视频91| 国产美女高潮久久白浆| 另类图片亚洲另类| 亚洲天堂第二页| 亚洲新声在线观看| 91理论片午午论夜理片久久| 丁香五六月婷婷久久激情| 97色伦亚洲国产| 欧美xxxx做受欧美| 国产精品视频免费在线| 91精品中国老女人| 日本国产欧美一区二区三区| 日本精品免费一区二区三区| 国产精品爽爽ⅴa在线观看| 日韩av毛片网| 国产啪精品视频网站| 国产日韩精品入口| 亚洲欧洲在线看| 国产亚洲欧美aaaa| 国产一区二区动漫| 欧美激情一级精品国产| 国产欧美日韩91| 亚洲丝袜在线视频| 日韩精品中文字幕有码专区| 久久久久久久激情视频| 欧美激情在线狂野欧美精品| 国产精品大片wwwwww| 久久久影视精品| 久久精品国产久精国产一老狼| 欧美激情精品久久久久久免费印度| 久久偷看各类女兵18女厕嘘嘘| 亚洲精品日韩欧美| 午夜精品国产精品大乳美女| 日韩精品免费在线播放| 欧美精品激情在线| 欧美xxxx综合视频| 亚洲精选中文字幕| 成人黄色在线免费| 国产精品一区专区欧美日韩| 国内精品久久影院| 主播福利视频一区| 国产精品网址在线| 成人午夜在线影院| 成人妇女淫片aaaa视频| 欧美成人精品h版在线观看| www.欧美视频| 亚洲人成电影网站色| 欧美色视频日本高清在线观看| 亚洲影视中文字幕| 国产成人在线一区二区| 国产剧情日韩欧美| 日韩精品视频在线免费观看| 国产日韩欧美在线看| 亚洲人在线视频| 最新69国产成人精品视频免费| 亚洲午夜女主播在线直播| 亚洲一二三在线| 精品国产一区二区三区久久久| 亚洲天堂免费视频| 欧美第一页在线| 亚洲福利影片在线| 成人久久18免费网站图片| 日韩精品视频中文在线观看| 日韩中文字幕av| 国自在线精品视频| 日韩美女视频在线观看| 92版电视剧仙鹤神针在线观看| 91中文在线视频| 国产精品男人爽免费视频1| 91免费国产视频| 欧美在线欧美在线| 日韩av在线一区| 韩国视频理论视频久久| 国产成人综合亚洲| 欧美性xxxxx极品娇小| 国产精品一区二区三区在线播放| 亚洲一区免费网站| 日韩经典一区二区三区| 免费av一区二区| 日韩最新免费不卡| 色偷偷av一区二区三区| 国产精品久久久av| 粗暴蹂躏中文一区二区三区| 中文国产成人精品| 国产丝袜视频一区| 97国产一区二区精品久久呦| 538国产精品一区二区在线| 97香蕉超级碰碰久久免费软件| 日韩成人av一区| 亚洲精品视频在线观看视频| 久久久极品av| 国产精品aaa| 久久久久久999| 精品国产一区二区三区久久狼黑人| 久久久久久久国产精品| 亚洲国产精品久久| 91精品一区二区| 亚洲国产精品网站| 亚洲视频免费一区| 亚洲欧美成人在线| 国产一区二区三区四区福利| 欧美激情视频网| 色先锋久久影院av| 精品性高朝久久久久久久| 日韩亚洲国产中文字幕| 色av吧综合网| 国产九九精品视频| 久久99精品久久久久久青青91| 久久久免费高清电视剧观看| 国产成人精品av| 在线观看中文字幕亚洲| 精品在线观看国产| 欧美极品少妇xxxxⅹ喷水| 亚洲一区av在线播放| 日韩在线观看电影| 亚洲美女中文字幕| 成人乱人伦精品视频在线观看| 亚洲人成亚洲人成在线观看| 亚洲精品中文字幕有码专区| 国产激情久久久| 国产精品极品美女粉嫩高清在线| 亚洲精品电影久久久| 色综合导航网站| 国产成人拍精品视频午夜网站| 欧美激情在线观看| 成人激情在线观看| 欧美日韩精品在线播放| 日韩美女在线观看| yellow中文字幕久久| 欧美性猛交xxxx富婆| 国产精品久久久久久av下载红粉| www.日韩视频| 亚洲精品美女免费| 日韩av手机在线看| 国产精品日日摸夜夜添夜夜av| 最近2019免费中文字幕视频三| 成人免费网站在线看| 国产精品久久久久福利| 欧美日韩免费一区| 高清欧美性猛交xxxx| 国产精品三级久久久久久电影| 亚洲人成电影网站色www| 欧美最猛性xxxxx亚洲精品| 国产在线不卡精品| 日韩免费黄色av| 久久久久国产精品一区| 久久久久国产精品一区| 成人中文字幕在线观看| 欧美高清videos高潮hd| 国产日本欧美在线观看| 欧美www在线| 国产免费观看久久黄| 日韩av电影国产| 成人精品视频在线| 成人国产精品av| 最近2019中文字幕一页二页| 中文字幕欧美日韩va免费视频| 久久久久久久久久久久av|