Giriş
Şu satırı dahil ederiz
import org.springframework.cloud.gateway.filter.ratelimit.RateLimiter; import org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter;
Maven
Şöyle yaparız. RequestRateLimiter altta Redis kullanır. Dolayısıyla data-redis gerekir.
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifatId>spring-boot-starter-data-redis-reactive</artifactId></dependency>
Açıklaması şöyle
RequestRateLimiter is one of the many gateway filters offered by SCG. The implementation determines whether a request is allowed to proceed or has exceeded its limit. ...the gateway comes with one that uses a user’s Principal name. A secured gateway is needed to resolve a user’s principal name, but you have the option to implement the KeyResolver interface to instead resolve a different key from the ServerWebExchange.You can point to a custom KeyResolver bean (for example, named customKeyResolver) in the configuration by using a SPEL #{@customKeyResolver} expression.
RequestRateLimiter sınfı RequestRateLimiterGatewayFilterFactory tarafından yaratılır
Açıklaması şöyle
The provided Redis implementation lets you define the request rate at which users can make calls within a certain time period. It also makes it possible to accommodate sporadic demands while constrained by the defined consumption rate. For example, a configuration can define a replenish rate of 500 requests per second by setting the redis-rate-limiter.replenishRate=500 property and a burst capacity of 1000 request per second by setting the redis-rate-limiter.burstCapacity=1000 property. Doing so limits consumption to 500 requests every second. If a burst in the number of requests occurs, only 1,000 requests are allowed. However, because 1,000 requests are a quota of 2 seconds, the gateway would not route requests for the next second. The configuration also lets you define how many tokens a request would cost by setting the property redis-rate-limiter.requestedTokens property. Typically, it is set to 1.To use a gateway with a request limiting feature, it needs to be configured with the RequestRateLimiter gateway filter.
Yani şöyle yaparız
spring:cloud: gateway: routes: - id: route1 uri: http://localhost:8081 predicates: - Path=/backend filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 500 redis-rate-limiter.burstCapacity: 1000 redis-rate-limiter.requestedTokens: 1
Açıklaması şöyle
burstCapacity, the total capacity of the token bucket.replenishRate, the average rate at which the token bucket is filled per second.
KeyResolver  Arayüzü
Şu satırı dahil ederiz
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
Eğer KeyResolver kullanmak istersek şöyle yaparız
spring:cloud: gateway: routes: - id: route1 uri: http://localhost:8081 predicates: - Path=/backend filters: - name: RequestRateLimiter args: rate-limiter: "#{customRateLimiter}" key-resolver: "#{customKeyResolver}" @Bean public KeyResolver customKeyResolver { return exchange -> .... // returns a Mono of String }
Çok detaylı bir örnek burada
Örnek
Şöyle yaparız
server:
  port: 8081
spring:
  cloud:
    gateway:
      routes:
      - id: limit_route
        uri: http://httpbin.org:80/get
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]
        filters:
        - name: RequestRateLimiter
          args:
            key-resolver: '#{@hostAddrKeyResolver}'
            redis-rate-limiter.replenishRate: 1
            redis-rate-limiter.burstCapacity: 3
  application:
    name: gateway-limiter
  redis:
    host: localhost
    port: 6379
    database: 0Açıklaması şöyle
key-resolver, the name of the bean object of the resolver for the throttled key. It uses SpEL expressions to get bean objects from the Spring container based on #{@beanName}.
Hostname özelliğine göre sınırlamak için şöyle yaparız
public class HostAddrKeyResolver implements KeyResolver {
  @Override
  public Mono<String> resolve(ServerWebExchange exchange) {
    return Mono.just(exchange.getRequest().getRemoteAddress()
      .getAddress().getHostAddress());
  }
}
@Bean
public HostAddrKeyResolver hostAddrKeyResolver() {
  return new HostAddrKeyResolver();
}URI'ye göre sınırlamak için şöyle yaparız
public class UriKeyResolver  implements KeyResolver {
  @Override
  public Mono<String> resolve(ServerWebExchange exchange) {
    return Mono.just(exchange.getRequest().getURI().getPath());
  }
}
@Bean
public UriKeyResolver uriKeyResolver() {
  return new UriKeyResolver();
}Örnek
Şöyle yaparız
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;import org.springframework.web.server.ServerWebExchange;import com.auth0.jwt.JWT;import com.auth0.jwt.exceptions.JWTDecodeException;import com.auth0.jwt.interfaces.Claim;import com.auth0.jwt.interfaces.DecodedJWT;import io.netty.util.internal.StringUtil;import reactor.core.publisher.Mono;public class CustomerKeyResolver implements KeyResolver {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {String apiName = exchange.getRequest().getPath().toString();List<String> customerIds = exchange.getRequest().getHeaders().get("X-Customer-Id");if (customerIds != null && ...) {return Mono.just(customerIds.get(0) + StringUtil.COMMA + apiName);}List<String> authHeaders = exchange.getRequest().getHeaders().get("Authorization");if (authHeaders != null && ...) {...}return Mono.just(StringUtil.EMPTY_STRING);}}
 
Hiç yorum yok:
Yorum Gönder