前言
由于采用微服务架构,项目需要拥有一个统一的入口,因此开发了网关。该项目中,网关主要用于完成鉴权、日志、限流、转发等功能。
基于IP限流过滤器实现
限流过滤器配置
spring:
cloud:
gateway:
routes:
- id: request_rate_limiter_route
predicates:
- Path=/**
filters:
- name: RequestRateLimiter
args:
denyEmptyKey: true
emptyKeyStatus: SERVICE_UNAVAILABLE
keyResolver: '#{@ipAddressKeyResolver}'
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
uri: http://127.0.0.1:8888
其中'#{@ipAddressKeyResolver}'是指定使用自定义的ipResolver。
IpAddressKeyResolver实现
/**
* 描述:Ip请求限流器
*
* @author xhsf
* @create 2020/11/25 15:04
*/
@Service
public class IpAddressKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
}
依赖
限流过滤器使用Redis实现,因此需要引入Redis依赖,并配置账号密码URL。
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>