拦截、限流,针对场景详细信息(二)

发布于:2025-04-01 ⋅ 阅读:(13) ⋅ 点赞:(0)

      下面方法是与上一篇文章有个同样的效果,更加简洁方便。

.yml配置项如下

spring:

  cloud:

    gateway:

       discovery:

           enable: true

       routes:

           - id: study-happy-business

              uri: http://ip:port/

              predicates:

                 - Path=/business/one/**

              filters:

                 - name: MyRequestRateLimiter                      args:

                       key-resolver: "#{@urlKey}"

                       redis-rate-limiter.replenishRate:3

                       redis-rate-limiter.burstCapacity: 3

                       redis-rate-limiter.requestedTokens: 1

                 - name: MyRequestRateLimiter                      args:

                       key-resolver: "#{@ipKey}"

                       redis-rate-limiter.replenishRate: 3

                       redis-rate-limiter.burstCapacity:3

                       redis-rate-limiter.requestedTokens: 1

                 - name: CircuitBreaker

                    args:

                       fallbackUri: forward:/error

创建key-resolver的配置类

@Configuration

public class KeyResolverConfig {

 

    @Primary

    @Bean("uriKey")

    public UriKeyResolver uriKey() {

        //获取交易路径

        return new UriKeyResolver();

    }

 

    @Bean("ipKey")

    public IpKeyResolver ipKey() {

        //获取用户ip

        return new IpKeyResolver();

    }

}

创建获取交易路径path和用户ip的类

需注意,以下是两个类,使用时记得分开创建

// IpKeyResolver.java

public class IpKeyResolver implements KeyResolver {

    @Override

    public Mono<String> resolve(ServerWebExchange exchange) {

        return Mono.just(IpUtil.getClientIP(exchange.getRequest()));

    }

}

 

// UriKeyResolver.java(根据语义修正类名拼写)

public class UriKeyResolver implements KeyResolver {

    @Override

    public Mono<String> resolve(ServerWebExchange exchange) {

        return Mono.just(exchange.getRequest().getURI().getPath());

    }

}