限流实现
在 Gateway 上实现限流是个不错的选择,只需要编写一个过滤器就可以了。有了前边过滤器的基础,写起来很轻松。(如果你对 Spring Cloud Gateway 的过滤器还不了解,请先看这里)了解springcloud架构可以加求求:三五三六二四七二五九
我们这里采用令牌桶算法,Google Guava 的 RateLimiter
、Bucket4j、RateLimitJ 都是一些基于此算法的实现,只是他们支持的 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 配置 Hystrix 熔断、限流、后台调用注意点 Spring Cloud Gateway 是一种基于 Spring Boot 框架的 API 网关解决方案,提供了许多实用的功能来管理和保护微服务架构中的 API。其中,Hystrix ...
Spring Cloud Gateway 限流操作详解 Spring Cloud Gateway 作为一种基于微服务架构的API网关,提供了强大的功能,其中限流操作是其中一个非常重要的功能。限流操作主要是为了保护系统的可用性,防止高并发请求对...
而"简单路由及默认过滤器"则意味着Gateway已经配置了一些基础的路由规则,将请求导向不同的微服务,同时使用了SpringCloud Gateway提供的默认过滤器链,这些过滤器可能包括请求限流、身份验证等。 接下来,我们看到...
路由断言工厂用于判断请求是否应路由到特定的服务,而过滤器工厂则用于执行对请求和响应的具体操作,如限流、鉴权、重试等。Spring Cloud Gateway提供的这些功能使得它成为构建微服务架构中强大且灵活的入口点。 ...
它负责路由请求到相应的微服务,并可以提供过滤器功能,如限流、熔断等。而Spring Security 则是 Java 开发中广泛使用的安全框架,用于实现认证和授权。当我们将这两者结合时,我们可以创建一个强大的统一登录认证...
在微服务架构中,网关作为服务入口,承担着路由转发、限流熔断、鉴权认证等职责。Spring Cloud Gateway作为一款基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建的云原生网关框架,它提供了强大的路由...
它是Spring Cloud生态中的一个API网关服务,提供路由、熔断、限流等能力,可以作为所有微服务的统一入口。为了添加自定义的全局过滤器,我们需要创建一个新的Java类并实现`GlobalFilter`接口。这个过滤器将在每个...
Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的云原生微服务网关,它旨在提供一种简单而有效的方式来对 API 进行路由,同时提供了过滤器功能,可以进行权限验证、限流、日志记录等...
项目中包含的SpringCloud中文文档将为开发者提供详细的指导,帮助他们理解和使用这些组件。文档通常会涵盖安装配置、基本使用、高级特性以及最佳实践等内容,是学习和实施微服务架构的重要参考资料。 总之,Spring ...
Spring Cloud Zookeeper Gateway 是一个基于Spring Cloud生态系统的项目,它结合了Zookeeper作为微服务注册中心和Spring Cloud Gateway作为服务网关的解决方案。这个项目旨在为开发者提供一个快速搭建微服务架构的...
在使用 SpringCloudGateway2.1 使用手册中文版时,你可以找到关于如何配置路由、使用过滤器、集成服务发现、安全设置等方面的详细指导。手册中应该会包含以下内容: 1. **快速入门**:介绍如何创建基本的 Spring ...
在现代微服务架构中,Spring Cloud Gateway作为一款强大的API网关,被广泛应用于服务路由、熔断、限流等场景。而Nacos作为阿里巴巴提供的一个分布式服务治理平台,提供了服务注册与发现、配置管理等功能。将Nacos与...
此外,Spring Cloud Gateway 提供了丰富的过滤器,比如 SecurityFilter、RateLimiterFilter 等,可以根据需求定制,实现如认证、限流、熔断等高级功能。在 "spring-cloud-gateway-demo" 中,你可能会看到这些过滤器...
百讯基于SpringCloud gateway 实现鉴权限流网关.zip
Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Spring Boot 2 构建的微服务网关,它是 Spring Cloud 生态系统中的重要组件,旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它作为一个高可...
在Spring Cloud生态体系中,Spring Cloud Gateway作为新一代的API网关,被广泛应用于微服务架构中,用于统一处理请求路由、过滤器链、限流、熔断等核心功能。本篇将详细介绍Spring Cloud Gateway的配置文件相关知识...
Spring Cloud Gateway是Spring...Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的云应用入口网关。它提供了诸如路由、过滤器、动态路由等高级功能,是微服务架构中常见的组件。Sentinel 是阿里巴巴开源的一款流量控制...
这个“SpringCloud-Gateway demo.rar”文件很可能是包含了演示如何设置和使用 Spring Cloud Gateway 的一个示例项目。 在Spring Cloud Gateway中,核心概念有以下几点: 1. **路由(Route)**:路由是 Gateway 的...