麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > Java > 正文

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

2024-07-14 08:42:48
字體:
供稿:網(wǎng)友

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

除了Spring Cloud Netflix Zuul依賴項之外,我們還需要將Spring Cloud Zuul RateLimit 添加到我們的應(yīng)用程序的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>

首先,讓我們創(chuàng)建幾個REST端點,我們將在其上應(yīng)用速率限制。

下面是一個簡單的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下,我們提供端點詳細(xì)信息。在zuul.ratelimit.policy-list下,我們?yōu)槎它c提供速率限制配置。該限屬性指定的時間端點可以在內(nèi)部被稱為數(shù)字刷新間隔。

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

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

  • origin - 基于用戶原始請求的速率限制
  • url - 基于下游服務(wù)的請求路徑的速率限制
  • user - 基于經(jīng)過身份驗證的用戶名或“匿名”的速率限制
  • No value - 充當(dāng)每項服務(wù)的全局配置。要使用這種方法,請不要設(shè)置參數(shù)'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進行一次調(diào)用。請求成功,因為它在速率限制內(nèi)。

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

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]:  調(diào)用端點的剩余嘗試次數(shù)
  • X-RateLimit-Reset- [key]:為端點配置 的刷新間隔的剩余毫秒數(shù)

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

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

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

讓我們看看當(dāng)我們超過速率限制時會發(fā)生什么:

@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());}

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

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秒鐘。這是為端點配置的刷新間隔。最后,我們再次觸發(fā)端點并獲得成功的響應(yīng)。

自定義密鑰生成器

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

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

@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

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

自定義錯誤處理

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

當(dāng)我們需要以不同方式處理錯誤時,我們可以定義一個自定義的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上 找到本文的完整代碼

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美高清第一页 | 线观看免费完整aaa 久久不雅视频 | 毛片在线免费观看网址 | 久久成人午夜视频 | 羞羞视频免费观看入口 | 国产高潮好爽好大受不了了 | 一级大片一级一大片 | 狠狠干b| 成人午夜免费在线视频 | 国产羞羞网站 | 成人福利视频 | 亚洲经典视频 | 久久久久久久久久久久久九 | 一区二区网 | 久草最新 | 亚洲啊v在线观看 | 欧美一级性 | 欧美中文字幕一区二区三区亚洲 | a黄在线观看 | 久久精品美乳 | 国产成人av免费观看 | a级黄色片视频 | 久青草免费视频 | 欧美在线观看黄色 | 国产91精品亚洲精品日韩已满 | 爱操av| videos韩国 | 黄wwww| 日本在线不卡一区二区 | 国产永久免费观看 | 久啪视频| 久久久久久久黄色片 | 久久吊 | 日日影视 | 天堂亚洲一区 | 国产精选电影免费在线观看 | sese在线视频| 特级黄色影院 | 成人在线观看免费爱爱 | 第一区免费在线观看 | 欧美国产成人在线 |