`

Spring Cloud Gateway(限流)

阅读更多

限流实现

在 Gateway 上实现限流是个不错的选择,只需要编写一个过滤器就可以了。有了前边过滤器的基础,写起来很轻松。(如果你对 Spring Cloud Gateway 的过滤器还不了解,请先看这里)了解springcloud架构可以加求求:三五三六二四七二五九

我们这里采用令牌桶算法,Google Guava 的 RateLimiterBucket4jRateLimitJ 都是一些基于此算法的实现,只是他们支持的 back-ends(JCache、Hazelcast、Redis 等)不同罢了,你可以根据自己的技术栈选择相应的实现。

这里我们使用 Bucket4j,引入它的依赖坐标,为了方便顺便引入 Lombok

<dependency>
    <groupId>com.github.vladimir-bukhtoyarov</groupId>
    <artifactId>bucket4j-core</artifactId>
    <version>4.0.0</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
    <scope>provided</scope>
</dependency>

 我们来实现具体的过滤器

@CommonsLog
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RateLimitByIpGatewayFilter implements GatewayFilter,Ordered {

    int capacity;
    int refillTokens;
    Duration refillDuration;

    private static final Map<String,Bucket> CACHE = new ConcurrentHashMap<>();

    private Bucket createNewBucket() {
        Refill refill = Refill.of(refillTokens,refillDuration);
        Bandwidth limit = Bandwidth.classic(capacity,refill);
        return Bucket4j.builder().addLimit(limit).build();
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {
        // if (!enableRateLimit){
        //     return chain.filter(exchange);
        // }
        String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
        Bucket bucket = CACHE.computeIfAbsent(ip,k -> createNewBucket());

        log.debug("IP: " + ip + ",TokenBucket Available Tokens: " + bucket.getAvailableTokens());
        if (bucket.tryConsume(1)) {
            return chain.filter(exchange);
        } else {
            exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
            return exchange.getResponse().setComplete();
        }
    }

    @Override
    public int getOrder() {
        return -1000;
    }

}

 通过对令牌桶算法的了解,我们知道需要定义三个变量:

  • capacity:桶的最大容量,即能装载 Token 的最大数量
  • refillTokens:每次 Token 补充量
  • refillDuration:补充 Token 的时间间隔

在这个实现中,我们使用了 IP 来进行限制,当达到最大流量就返回 429 错误。这里我们简单使用一个 Map 来存储 bucket,所以也决定了它只能单点使用,如果是分布式的话,可以采用 Hazelcast 或 Redis 等解决方案。

在 Route 中我们添加这个过滤器,这里指定了 bucket 的容量为 10 且每一秒会补充 1 个 Token。

.route(r -> r.path("/throttle/customer/**")
             .filters(f -> f.stripPrefix(2)
                            .filter(new RateLimitByIpGatewayFilter(10,1,Duration.ofSeconds(1))))
             .uri("lb://CONSUMER")
             .order(0)
             .id("throttle_customer_service")
)

 

 

分享到:
评论

相关推荐

    spring cloud gateway 限流的实现与原理

    Spring Cloud Gateway 限流实现与原理 Spring Cloud Gateway 是一种基于微服务架构的网关解决方案,限流是网关最基本的功能之一。限流的实现可以防止大量的请求使服务器过载,导致服务不可用,也可以防止网络攻击。...

    spring cloud gateway配置Hystrix 熔断、限流、后台调用注意点.pdf

    Spring Cloud Gateway 配置 Hystrix 熔断、限流、后台调用注意点 Spring Cloud Gateway 是一种基于 Spring Boot 框架的 API 网关解决方案,提供了许多实用的功能来管理和保护微服务架构中的 API。其中,Hystrix ...

    详解Spring Cloud Gateway 限流操作

    Spring Cloud Gateway 限流操作详解 Spring Cloud Gateway 作为一种基于微服务架构的API网关,提供了强大的功能,其中限流操作是其中一个非常重要的功能。限流操作主要是为了保护系统的可用性,防止高并发请求对...

    springcloud Gateway网关-压测用.zip

    而"简单路由及默认过滤器"则意味着Gateway已经配置了一些基础的路由规则,将请求导向不同的微服务,同时使用了SpringCloud Gateway提供的默认过滤器链,这些过滤器可能包括请求限流、身份验证等。 接下来,我们看到...

    最新Spring Cloud Gateway 官方参考指南-中文版-3.x

    路由断言工厂用于判断请求是否应路由到特定的服务,而过滤器工厂则用于执行对请求和响应的具体操作,如限流、鉴权、重试等。Spring Cloud Gateway提供的这些功能使得它成为构建微服务架构中强大且灵活的入口点。 ...

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    它负责路由请求到相应的微服务,并可以提供过滤器功能,如限流、熔断等。而Spring Security 则是 Java 开发中广泛使用的安全框架,用于实现认证和授权。当我们将这两者结合时,我们可以创建一个强大的统一登录认证...

    Spring Cloud Gateway的全局异常处理

    在微服务架构中,网关作为服务入口,承担着路由转发、限流熔断、鉴权认证等职责。Spring Cloud Gateway作为一款基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建的云原生网关框架,它提供了强大的路由...

    springcloud gateway 全局过滤器统一签名判定.doc

    它是Spring Cloud生态中的一个API网关服务,提供路由、熔断、限流等能力,可以作为所有微服务的统一入口。为了添加自定义的全局过滤器,我们需要创建一个新的Java类并实现`GlobalFilter`接口。这个过滤器将在每个...

    spring cloud gateway 例子

    Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的云原生微服务网关,它旨在提供一种简单而有效的方式来对 API 进行路由,同时提供了过滤器功能,可以进行权限验证、限流、日志记录等...

    Spring Cloud Eureka + Spring Cloud Gateway + Spring Cloud Zipkin

    项目中包含的SpringCloud中文文档将为开发者提供详细的指导,帮助他们理解和使用这些组件。文档通常会涵盖安装配置、基本使用、高级特性以及最佳实践等内容,是学习和实施微服务架构的重要参考资料。 总之,Spring ...

    spring cloud zookeeper gateway

    Spring Cloud Zookeeper Gateway 是一个基于Spring Cloud生态系统的项目,它结合了Zookeeper作为微服务注册中心和Spring Cloud Gateway作为服务网关的解决方案。这个项目旨在为开发者提供一个快速搭建微服务架构的...

    SpringCloudGateway2.1使用手册中文版.rar

    在使用 SpringCloudGateway2.1 使用手册中文版时,你可以找到关于如何配置路由、使用过滤器、集成服务发现、安全设置等方面的详细指导。手册中应该会包含以下内容: 1. **快速入门**:介绍如何创建基本的 Spring ...

    基于Nacos实现Spring Cloud Gateway实现动态路由的方法示例

    在现代微服务架构中,Spring Cloud Gateway作为一款强大的API网关,被广泛应用于服务路由、熔断、限流等场景。而Nacos作为阿里巴巴提供的一个分布式服务治理平台,提供了服务注册与发现、配置管理等功能。将Nacos与...

    spring-cloud-gateway-demo.zip

    此外,Spring Cloud Gateway 提供了丰富的过滤器,比如 SecurityFilter、RateLimiterFilter 等,可以根据需求定制,实现如认证、限流、熔断等高级功能。在 "spring-cloud-gateway-demo" 中,你可能会看到这些过滤器...

    百讯基于SpringCloud gateway 实现鉴权限流网关.zip

    百讯基于SpringCloud gateway 实现鉴权限流网关.zip

    springcloud gateway

    Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Spring Boot 2 构建的微服务网关,它是 Spring Cloud 生态系统中的重要组件,旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它作为一个高可...

    SpringCloud.03.网关Gateway 配置文件

    在Spring Cloud生态体系中,Spring Cloud Gateway作为新一代的API网关,被广泛应用于微服务架构中,用于统一处理请求路由、过滤器链、限流、熔断等核心功能。本篇将详细介绍Spring Cloud Gateway的配置文件相关知识...

    Spring Cloud Gateway是Spring官方基于Spring 5.0.zip

    Spring Cloud Gateway是Spring...Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

    spring cloud gateway整合sentinel实现网关限流

    Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的云应用入口网关。它提供了诸如路由、过滤器、动态路由等高级功能,是微服务架构中常见的组件。Sentinel 是阿里巴巴开源的一款流量控制...

    SpringCloud-Gateway demo.rar

    这个“SpringCloud-Gateway demo.rar”文件很可能是包含了演示如何设置和使用 Spring Cloud Gateway 的一个示例项目。 在Spring Cloud Gateway中,核心概念有以下几点: 1. **路由(Route)**:路由是 Gateway 的...

Global site tag (gtag.js) - Google Analytics