欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年11月12日 09:15:19   作者:banq  
這篇文章主要介紹了詳解Spring Cloud Netflix Zuul中的速率限制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

除了Spring Cloud Netflix Zuul依賴項(xiàng)之外,我們還需要將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端點(diǎn),我們將在其上應(yīng)用速率限制。

下面是一個簡單的Spring Controller類,有兩個端點(diǎn):

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

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

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

  • origin - 基于用戶原始請求的速率限制
  • url - 基于下游服務(wù)的請求路徑的速率限制
  • user - 基于經(jīng)過身份驗(yàn)證的用戶名或“匿名”的速率限制
  • No value - 充當(dāng)每項(xiàng)服務(wù)的全局配置。要使用這種方法,請不要設(shè)置參數(shù)'type'

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

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

在這里,我們只對一個端點(diǎn)/ greeting / simple進(jìn)行一次調(diào)用。請求成功,因?yàn)樗谒俾氏拗苾?nèi)。

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

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

X-RateLimit-Remaining-rate-limit-application_serviceSimple_127.0.0.1: 4

X-RateLimit-Reset-rate-limit-application_serviceSimple_127.0.0.1: 60000

解釋:

  • X-RateLimit-Limit- [key]:為端點(diǎn)配置 的限制
  • X-RateLimit-Remaining- [key]:  調(diào)用端點(diǎn)的剩余嘗試次數(shù)
  • X-RateLimit-Reset- [key]:為端點(diǎn)配置 的刷新間隔的剩余毫秒數(shù)

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

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

X-RateLimit-Remaining-rate-limit-application_serviceSimple_127.0.0.1: 3

X-RateLimit-Reset-rate-limit-application_serviceSimple_127.0.0.1: 57031

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

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

@Test
public 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: 1

X-RateLimit-Remaining-rate-limit-application_serviceAdvanced_127.0.0.1: 0

X-RateLimit-Reset-rate-limit-application_serviceAdvanced_127.0.0.1: 268

之后,我們休息了2秒鐘。這是為端點(diǎn)配置的刷新間隔。最后,我們再次觸發(fā)端點(diǎn)并獲得成功的響應(yīng)。

自定義密鑰生成器

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

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

@Bean
public 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)鍵點(diǎn)是  RateLimitKeyGenerator bean將由spring-cloud-zuul-ratelimit自動配置。

自定義錯誤處理

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

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

@Bean
public 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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例

    MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例

    這篇文章主要介紹了MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 基于SpringBoot+Avue實(shí)現(xiàn)短信通知功能

    基于SpringBoot+Avue實(shí)現(xiàn)短信通知功能

    Avue是基于vue和element-ui的快速開發(fā)框架 ,它的核心是數(shù)據(jù)驅(qū)動UI的思想,讓我們從繁瑣的crud開發(fā)中解脫出來,本文將給大家介紹一下使用SpringBoot+Avue實(shí)現(xiàn)短信通知功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-09-09
  • Mockito mock Kotlin Object類方法報錯解決方法

    Mockito mock Kotlin Object類方法報錯解決方法

    這篇文章主要介紹了Mockito mock Kotlin Object類方法報錯解決方法,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java中的原子類AtomicInteger使用詳解

    Java中的原子類AtomicInteger使用詳解

    這篇文章主要介紹了Java中的原子類AtomicInteger使用詳解,原子操作是指不會被線程調(diào)度機(jī)制打斷的操作,這種操作一旦開始,就一直運(yùn)行到結(jié)束,中間不會有任何線程上下文切換,需要的朋友可以參考下
    2023-12-12
  • SpringMVC集成Swagger實(shí)例代碼

    SpringMVC集成Swagger實(shí)例代碼

    本篇文章主要介紹了SpringMVC集成Swagger實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Mybatis中自定義實(shí)例化SqlSessionFactoryBean問題

    Mybatis中自定義實(shí)例化SqlSessionFactoryBean問題

    這篇文章主要介紹了Mybatis中自定義實(shí)例化SqlSessionFactoryBean問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • mybatis group by substr函數(shù)傳參報錯的解決

    mybatis group by substr函數(shù)傳參報錯的解決

    這篇文章主要介紹了mybatis group by substr函數(shù)傳參報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 使用SpringMVC 重寫、擴(kuò)展HttpServletRequest請求參數(shù)

    使用SpringMVC 重寫、擴(kuò)展HttpServletRequest請求參數(shù)

    這篇文章主要介紹了使用SpringMVC 重寫、擴(kuò)展HttpServletRequest請求參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java用戶登錄驗(yàn)證代碼

    Java用戶登錄驗(yàn)證代碼

    本文給大家使用java代碼實(shí)現(xiàn)用戶登錄驗(yàn)證功能,當(dāng)用戶輸入三次錯誤后,用戶不可以再次登錄的。具體實(shí)現(xiàn)代碼,大家可以參考下本教程
    2016-08-08
  • Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南

    Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南

    這篇文章主要介紹了Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論