【Spring Cloud Gateway】基于 IP 限流过滤器实现

905 阅读1分钟

前言

由于采用微服务架构,项目需要拥有一个统一的入口,因此开发了网关。该项目中,网关主要用于完成鉴权、日志、限流、转发等功能。

基于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>