高并发场景下,网关作为流量的入口非常重要,下面我重点详解Spring Cloud Gateway如何抗住百万并发@mikechen
异步非阻塞模型:百万并发的基石
Spring Cloud Gateway,采用了异步非阻塞模型,这是其实现百万并发的基石。
为什么采用“异步非阻塞”,原因是:传统的Web服务器通常采用I/O阻塞模型,即每个请求都会占用一个线程。
当请求处理时间较长时,会阻塞该线程,导致服务器可处理的并发请求数量受限于线程池大小。
Spring Cloud Gateway底层,基于高性能的Netty框架,Netty采用NIO(非阻塞I/O)模式。
Netty通过少数的I/O线程(Event Loop),来处理大量的并发连接。
这些I/O线程不会阻塞在某个I/O操作上,而是通过事件通知机制,在数据准备好时才进行处理。
采用这种方式, 少量线程可以处理大量的并发请求。
避免了传统模型中大量线程创建和销毁的开销,以及线程上下文切换的损耗。
Reactor异步机制
Spring Cloud Gateway的异步非阻塞模型是建立在:Project Reactor之上的。
Reactor 本质上是事件驱动模型 + 非阻塞 I/O + 背压机制 的组合,用极少的线程实现高吞吐量。
Spring Cloud Gateway 构建了一套完整的响应式处理链:每个请求从接入、过滤器链、路由转发、响应。
Request ↓ PreFilter1 ↓ PreFilter2 ↓ RouteHandler (WebClient 异步调用) ↓ PostFilter1 ↓ PostFilter2 ↓ Response
每一层都是非阻塞执行,不会因为某个请求阻塞整个线程。
限流(Rate Limiting)
尽管异步非阻塞模型极大地提高了吞吐量,但后端服务的能力仍然是有限的。
为了防止瞬时流量过大导致后端服务崩溃,Spring Cloud Gateway提供了限流功能。
常见的限流策略,包括:令牌桶算法…等等。
spring: cloud: gateway: routes: - id: rate_limited_route uri: http://localhost:8080 predicates: - Path=/api/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20
令牌桶算法的核心思想是,以恒定的速率生产令牌,并把令牌放入一个固定容量的桶中。
例如,如果速率是 10 个令牌/秒,那么每秒会有 10 个令牌被添加到桶中。
桶的容量是有限的,如果桶已经满了,新生成的令牌会被丢弃。
而不是继续放入桶中,这确保了桶中令牌的最大数量不会超过其容量。
熔断(Circuit Breaking)
熔断机制,极大缓解了故障服务拖垮网关的问题,是高可用的关键保障。
比如:当下游服务出现异常或响应变慢时,网关需要快速失败,避免请求堆积。
Spring Cloud Gateway通常与Resilience4j(或Netflix Hystrix,但Hystrix已进入维护模式)…等熔断库集成。
通过熔断,可以防止雪崩,避免一个服务的故障导致整个系统瘫痪。
降级(Degradation)
降级是在系统负载过高或某个服务不可用时,为了保证核心功能的可用性而牺牲部分非核心功能或提供简化服务的一种策略。
Mono<Void> fallback = exchange.getResponse().writeWith( Mono.just(exchange.getResponse() .bufferFactory().wrap("服务繁忙,请稍后再试".getBytes())));
当熔断器打开时,请求不会再发送到故障服务,而是直接跳转到降级逻辑。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!

后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》