Gateway结合sentinel限流简介

在springcloud的微服务架构中,通过Gateway将资源对象藏在内网,只将Gateway暴露在外网服务中,所有的服务从外部到Gateway以后经过路由的转发,发送到各个微服务平台,此时需要Gateway可能将面临大量流量的访问,在某一刻的访问流量过大将导致网关服务不可用,那么将出现宕机的情况,并且从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。流量控制的解决方案有多种,此处写一下使用Springcloud Gateway和Sentinel的结合进行限流操作。

Sentinel是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。Sentinel具有以下特性:丰富的应用场景、完备的实时监控、广泛的开源生态、完善的SPI扩展点。Sentinel是阿里巴巴自研开源组件,支撑了阿里近10年的双十一促流量的核心场景,例如秒杀、消峰、集群限流,具备完善的实时监控系统。

springcloud gateway限流 业务模块pom配置 spring gateway sentinel限流_gateway

在具体讲述之前首先明确几个名词的定义

资源:资源是Sentinel的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在此次我们可以简单的理解为一个Restful服务接口。

规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

在Gateway的限流规则中,可以根据Gateway中已经配置的route资源名称或者用户的自定义的API分组这2中情况进行限流。若2者均有匹配的情况下以后者的匹配为准。

每个请求在Gateway中经过一个过滤器链的处理,可以对URL连接进行一些修改操作,例如PrefixPathGateFilterFactory在url地址前拼接固定的字符串,StriprefixGatewayFilterFactory把url字符串根据“/”分割,默认去掉几个字符,SentinelGateWayFilter中进行路由规则、自定义规则根据url路径拦截,调用Sentinel的规则进行流量控制。

此处注意:当一个请求访问服务网关时,若开启限流,限流规则通过,将直接在地NettyRoutingFilter中通过Netty发送http请求访问后端微服务。若限流不通过,同样此Filter中发送请求,请求地址还是访问网关的服务,在前面的Filter—NettyWriteResponseFilter中接收此请求,继续过滤器链。

Sentinel限流使用的规则是滑动窗口的原理,统计某一个时间窗口内的请求数量,通过Slots插槽(类似于过滤器链的模式)来统计流量进行控制。

Slots链的工作方式如下图所示:

springcloud gateway限流 业务模块pom配置 spring gateway sentinel限流_java_02

重要的2个Slot为StatisticSlotFlowSlot和FlowSlot,前者通过滑动窗口统计数量,FlowSlot对流量进行分析控制,判断是否允许通过。具体的统计信息均由ClusterBuilderSlot进行统计,具体的信息放在了一个Map【clusterNodeMap】中,此处不是源码解析,感兴趣的推荐一篇源码解析,受益匪浅。