下面方法是与上一篇文章有个同样的效果,更加简洁方便。
.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());
}
}