高并发场景下,Spring Cloud Gateway如何抗住百万并发?

高并发场景下,网关作为流量的入口非常重要,下面我重点详解Spring Cloud Gateway如何抗住百万并发@mikechen

异步非阻塞模型:百万并发的基石

Spring Cloud Gateway 之所以能够应对高并发,其核心就在于其完全的非阻塞式架构。

它彻底摒弃了传统 Servlet 容器中,“一个请求一个线程”的阻塞模型。

转而拥抱事件驱动和响应式编程,从而极大地提升了系统的并发处理能力和资源利用率。

在传统的阻塞 I/O 模型中,当服务器接收到一个连接后,会为这个连接创建一个独立的线程。

高并发场景下,Spring Cloud Gateway如何抗住百万并发?-mikechen

比如:从网络读取数据或写入数据到网络时,如果数据尚未准备好,该线程就会被阻塞,直到 I/O 操作完成。

这意味着,如果有大量的并发连接,就需要创建大量的线程。

每个阻塞的线程都会消耗宝贵的系统资源(内存、CPU 时间片),导致上下文切换频繁,最终限制了并发能力。

而Spring Cloud Gateway采用了基于Reactor响应式编程模型的非阻塞I/O架构,底层使用高性能的Netty服务器。

实现了,少量线程即可处理大量并发请求,避免线程阻塞和频繁切换。

 

Reactor异步机制

Spring Cloud Gateway采用Reactor库,实现异步非阻塞处理,核心是事件驱动、和回调机制。

Spring Cloud Gateway的核心,是基于Project Reactor的异步机制。

高并发场景下,Spring Cloud Gateway如何抗住百万并发?-mikechen

Reactor通常与Netty结合使用,Netty负责底层非阻塞网络I/O,基于Java NIO的Selector实现多路复用。

Reactor框架在Netty事件循环中调度异步任务,实现请求的非阻塞处理、和响应。

这种组合使得单个、或少量线程,即可高效管理成千上万的网络连接。

 

限流(Rate Limiting)

在高并发场景下,仅仅依靠异步非阻塞、和响应式编程是不够的。

还需要引入强大的服务保护机制,来防止系统过载、和雪崩效应。

比如:限流是指限制在一定时间内对服务的访问频率,在高并发场景下,它可以防止瞬时流量过大导致服务崩溃。

Spring Cloud Gateway通常通过集成外部限流组件(如Redis RateLimiter、Resilience4j、或Sentinel…等等),来实现限流。

比如:可以使用令牌桶/漏桶算法,来实现限流。

高并发场景下,Spring Cloud Gateway如何抗住百万并发?-mikechen

令牌桶算法以恒定速率生成令牌,请求需要获取令牌才能通过;

漏桶算法则以恒定速率处理请求,超出的请求会被丢弃或排队。

 

熔断(Circuit Breaking)

熔断机制:类似于电路中的熔断器。

当对某个下游服务的请求失败率或响应时间超过预设阈值时,网关会“熔断”对该服务的调用。

后续的请求将不再发送给该服务,而是直接返回错误或执行降级逻辑。

可以 防止因单个故障服务导致整个系统雪崩。

当服务暂时不可用时,快速失败可以避免请求堆积,保护系统资源。

Spring Cloud Gateway通常与Resilience4j或Hystrix(虽然Hystrix已进入维护模式,但仍有项目使用)集成。

高并发场景下,Spring Cloud Gateway如何抗住百万并发?-mikechen

熔断状态: 熔断器有三种状态:

关闭(CLOSED): 正常请求;

开启(OPEN): 触发熔断,请求直接失败;

半开(HALF_OPEN): 经过一段时间后,尝试发送少量请求以检测服务是否恢复。

 

降级(Degradation)

降级是指当系统压力过大或某些服务不可用时,牺牲部分非核心功能或返回默认值,以保证核心功能的可用性。

与熔断的关系,降级通常发生在熔断之后。

当熔断器开启时,可以配置一个降级方法作为备用方案。

评论交流
    说说你的看法