bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

SpringCloudGateway核心過濾器之請求限流詳解-創新互聯

環境:SpringBoot2.4.13 + Spring Cloud Gateway3.0.1

創新互聯專注于長寧企業網站建設,響應式網站建設,電子商務商城網站建設。長寧網站建設公司,為長寧等地區提供建站服務。全流程定制網站制作,專業設計,全程項目跟蹤,創新互聯專業和態度為您提供的服務
概述

RequestRateLimiter?GatewayFilter工廠使用一個RateLimiter實現來確定當前請求是否允許繼續。如果不是,返回HTTP?429 - Too Many Requests(默認情況下)的狀態。

該過濾器接受一個可選的keyResolver參數和特定于速率限制器的參數。該參數的作用就是用來根據你設定的規則生成key,比如在redis中使用什么key。

keyResolver是一個實現KeyResolver接口的bean。在配置中,使用SpEL按名稱引用bean。#{@userKeyResolver}是一個SpEL表達式,它引用了一個名為userKeyResolver的bean。KeyResolver接口如下所示:

public interface KeyResolver {

	Monoresolve(ServerWebExchange exchange);

}

默認情況下,如果KeyResolver沒有找到key,請求將被拒絕。你可以通過設置
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key (true或false)和spring.cloud.gateway.filter.request-rate- limititer來調整這種行為。empty-key-status-code屬性。

注意:RequestRateLimiter不能用“快捷方式”表示法進行配置。以下示例無效:

# INVALID SHORTCUT CONFIGURATION
spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}
使用Redis限流

Redis的實現是基于Stripe所做的工作。它需要使用
spring-boot-starter-data-redis-reactive?Spring Boot Starter。使用的算法是令牌桶算法。

計數器算法:有時間臨界問題。

漏桶算法: 速率固定,有浪費資源問題。

配置屬性說明:

redis-rate-limiter.replenishRate
允許用戶在不丟棄任何請求的情況下每秒執行多少請求。這是令牌桶被填充的速率。
redis-rate-limiter.burstCapacity
允許用戶在一秒鐘內執行的大請求數。這是令牌桶可以容納的令牌數量。將該值設置為零將阻止所有請求。
redis-rate-limiter.requestedTokens
一個請求花費多少令牌。這是為每個請求從桶中提取令牌的數量,默認為1。
  1. 一個穩定的速率是通過設置相同的值replenishRate和burstCapacity。
  2. 可以通過將burstCapacity設置為高于replenishRate來允許臨時突發。

速率限制器需要在突發之間留出一段時間(根據replenishRate補發率),因為兩個連續的爆發將導致丟棄的請求(HTTP 429 - Too Many requests)。

低于1個請求/秒的速率限制是通過以下方式實現的:將replenishRate設置為所需的請求數量,將requestedTokens設置為以秒為單位的時間跨度,將burstCapacity設置為replenishRate和requestedToken的乘積,例如,將replenishRate設為1,requestedTokens=60,?burstCapability設置為60,將導致1 request/min的限制。

配置示例:

spring:
  cloud:
    gateway:
      default-filters:
      - StripPrefix=1
      routes:
      - id: o001
        uri: lb://order-service
        predicates:
        - Path=/api-a/**, /api-b/**
        filters:
        - name: RequestRateLimiter
          args:
            #每秒允許用戶執行的請求數,而不丟棄任何請求。這是令牌桶的填充速率。
            redis-rate-limiter.replenishRate: 1
            #允許用戶在一秒鐘內完成的大請求數。這是令牌桶可以容納的令牌數。將此值設置為零將阻止所有請求。
            redis-rate-limiter.burstCapacity: 2
            #一個請求需要多少令牌。這是每個請求從存儲桶中獲取的令牌數,默認為1。
            redis-rate-limiter.requestedTokens: 1
            keyResolver: "#{@userKeyResolver}"
            #自定義狀態碼
            #statusCode: INTERNAL_SERVER_ERROR
@Configuration
public class RedisRateConfig {

  @Bean
  public KeyResolver userKeyResolver() {
    // 以orderId限流
    // return exchange ->Mono.just(exchange.getRequest().getQueryParams().getFirst("orderId"));
    // 以ip限流
    return exchange ->Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()) ;
  }

}

解釋:

這定義了每個IP1個請求速率的限制。允許2個請求的突發,但是在下一秒,只有1個請求可用。KeyResolver是一個獲取用戶請求參數的簡單方法(注意,不建議在生產環境中使用)。

自定義限速器

還可以將速率限制器定義為實現RateLimiter接口的bean。在配置中,您可以使用SpEL按名稱引用bean。#{@userRateLimiter}是一個SpEL表達式,它引用了一個名為userRateLimiter的bean。下面的清單定義了一個使用上一個清單中定義的KeyResolver的速率限制器:

spring:
  cloud:
    gateway:
      default-filters:
      - StripPrefix=1
      routes:
      - id: o001
        uri: lb://order-service
        predicates:
        - Path=/api-a/**, /api-b/**
        filters:
        - name: RequestRateLimiter
          args:
            rate-limiter: "#{@userRateLimiter}"
            keyResolver: "#{@userKeyResolver}"
public class UserRateLimiter implements RateLimiter{
  @Override
  public MapgetConfig() {
    return null;
  }
  @Override
  public ClassgetConfigClass() {
    return null;
  }
  @Override
  public Config newConfig() {
    return null;
  }
  @Override
  public MonoisAllowed(String routeId, String id) {
    return null;
  }
  public static class Config {
    @Min(1)
    private int replenishRate;
    @Min(0)
    private int burstCapacity = 1;
    @Min(1)
    private int requestedTokens = 1;
    public int getReplenishRate() {
      return replenishRate;
    }
    public Config setReplenishRate(int replenishRate) {
      this.replenishRate = replenishRate;
      return this;
    }
    public int getBurstCapacity() {
      return burstCapacity;
    }
    public Config setBurstCapacity(int burstCapacity) {
      this.burstCapacity = burstCapacity;
      return this;
    }
    public int getRequestedTokens() {
      return requestedTokens;
    }
    public Config setRequestedTokens(int requestedTokens) {
      this.requestedTokens = requestedTokens;
      return this;
    }
    @Override
    public String toString() {
      return new ToStringCreator(this).append("replenishRate", replenishRate)
        .append("burstCapacity", burstCapacity).append("requestedTokens", requestedTokens).toString();
    }
  }
}

完畢?。?!

Spring Cloud Gateway核心過濾器之請求限流詳解

原創2022-11-21 08:20·Spring全家桶實戰案例

環境:SpringBoot2.4.13 + Spring Cloud Gateway3.0.1


概述

RequestRateLimiter?GatewayFilter工廠使用一個RateLimiter實現來確定當前請求是否允許繼續。如果不是,返回HTTP?429 - Too Many Requests(默認情況下)的狀態。

該過濾器接受一個可選的keyResolver參數和特定于速率限制器的參數。該參數的作用就是用來根據你設定的規則生成key,比如在redis中使用什么key。

keyResolver是一個實現KeyResolver接口的bean。在配置中,使用SpEL按名稱引用bean。#{@userKeyResolver}是一個SpEL表達式,它引用了一個名為userKeyResolver的bean。KeyResolver接口如下所示:

public interface KeyResolver {

	Monoresolve(ServerWebExchange exchange);

}

默認情況下,如果KeyResolver沒有找到key,請求將被拒絕。你可以通過設置
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key (true或false)和spring.cloud.gateway.filter.request-rate- limititer來調整這種行為。empty-key-status-code屬性。

注意:RequestRateLimiter不能用“快捷方式”表示法進行配置。以下示例無效:

# INVALID SHORTCUT CONFIGURATION
spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}
使用Redis限流

Redis的實現是基于Stripe所做的工作。它需要使用
spring-boot-starter-data-redis-reactive?Spring Boot Starter。使用的算法是令牌桶算法。

計數器算法:有時間臨界問題。

漏桶算法: 速率固定,有浪費資源問題。

配置屬性說明:

redis-rate-limiter.replenishRate
允許用戶在不丟棄任何請求的情況下每秒執行多少請求。這是令牌桶被填充的速率。
redis-rate-limiter.burstCapacity
允許用戶在一秒鐘內執行的大請求數。這是令牌桶可以容納的令牌數量。將該值設置為零將阻止所有請求。
redis-rate-limiter.requestedTokens
一個請求花費多少令牌。這是為每個請求從桶中提取令牌的數量,默認為1。
  1. 一個穩定的速率是通過設置相同的值replenishRate和burstCapacity。
  2. 可以通過將burstCapacity設置為高于replenishRate來允許臨時突發。

速率限制器需要在突發之間留出一段時間(根據replenishRate補發率),因為兩個連續的爆發將導致丟棄的請求(HTTP 429 - Too Many requests)。

低于1個請求/秒的速率限制是通過以下方式實現的:將replenishRate設置為所需的請求數量,將requestedTokens設置為以秒為單位的時間跨度,將burstCapacity設置為replenishRate和requestedToken的乘積,例如,將replenishRate設為1,requestedTokens=60,?burstCapability設置為60,將導致1 request/min的限制。

配置示例:

spring:
  cloud:
    gateway:
      default-filters:
      - StripPrefix=1
      routes:
      - id: o001
        uri: lb://order-service
        predicates:
        - Path=/api-a/**, /api-b/**
        filters:
        - name: RequestRateLimiter
          args:
            #每秒允許用戶執行的請求數,而不丟棄任何請求。這是令牌桶的填充速率。
            redis-rate-limiter.replenishRate: 1
            #允許用戶在一秒鐘內完成的大請求數。這是令牌桶可以容納的令牌數。將此值設置為零將阻止所有請求。
            redis-rate-limiter.burstCapacity: 2
            #一個請求需要多少令牌。這是每個請求從存儲桶中獲取的令牌數,默認為1。
            redis-rate-limiter.requestedTokens: 1
            keyResolver: "#{@userKeyResolver}"
            #自定義狀態碼
            #statusCode: INTERNAL_SERVER_ERROR
@Configuration
public class RedisRateConfig {

  @Bean
  public KeyResolver userKeyResolver() {
    // 以orderId限流
    // return exchange ->Mono.just(exchange.getRequest().getQueryParams().getFirst("orderId"));
    // 以ip限流
    return exchange ->Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()) ;
  }

}

解釋:

這定義了每個IP1個請求速率的限制。允許2個請求的突發,但是在下一秒,只有1個請求可用。KeyResolver是一個獲取用戶請求參數的簡單方法(注意,不建議在生產環境中使用)。

自定義限速器

還可以將速率限制器定義為實現RateLimiter接口的bean。在配置中,您可以使用SpEL按名稱引用bean。#{@userRateLimiter}是一個SpEL表達式,它引用了一個名為userRateLimiter的bean。下面的清單定義了一個使用上一個清單中定義的KeyResolver的速率限制器:

spring:
  cloud:
    gateway:
      default-filters:
      - StripPrefix=1
      routes:
      - id: o001
        uri: lb://order-service
        predicates:
        - Path=/api-a/**, /api-b/**
        filters:
        - name: RequestRateLimiter
          args:
            rate-limiter: "#{@userRateLimiter}"
            keyResolver: "#{@userKeyResolver}"
public class UserRateLimiter implements RateLimiter{
  @Override
  public MapgetConfig() {
    return null;
  }
  @Override
  public ClassgetConfigClass() {
    return null;
  }
  @Override
  public Config newConfig() {
    return null;
  }
  @Override
  public MonoisAllowed(String routeId, String id) {
    return null;
  }
  public static class Config {
    @Min(1)
    private int replenishRate;
    @Min(0)
    private int burstCapacity = 1;
    @Min(1)
    private int requestedTokens = 1;
    public int getReplenishRate() {
      return replenishRate;
    }
    public Config setReplenishRate(int replenishRate) {
      this.replenishRate = replenishRate;
      return this;
    }
    public int getBurstCapacity() {
      return burstCapacity;
    }
    public Config setBurstCapacity(int burstCapacity) {
      this.burstCapacity = burstCapacity;
      return this;
    }
    public int getRequestedTokens() {
      return requestedTokens;
    }
    public Config setRequestedTokens(int requestedTokens) {
      this.requestedTokens = requestedTokens;
      return this;
    }
    @Override
    public String toString() {
      return new ToStringCreator(this).append("replenishRate", replenishRate)
        .append("burstCapacity", burstCapacity).append("requestedTokens", requestedTokens).toString();
    }
  }
}

完畢!?。?/p>

圖片

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

網站欄目:SpringCloudGateway核心過濾器之請求限流詳解-創新互聯
分享URL:http://vcdvsql.cn/article32/jippc.html

成都網站建設公司_創新互聯,為您提供標簽優化、外貿網站建設、建站公司、全網營銷推廣、微信小程序、軟件開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站網頁設計