Sentinel Gateway 网关流控实现原理和源码处理流程
网关流控实现原理
Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:
GatewayFlowRule:网关限流规则,针对 API Gateway 的场景定制的限流规则,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。
ApiDefinition:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。
以上是复制官网的介绍,更多具体的细节可参考Sentinel官网
Sentinel-Gateway 工作流程源码分析
Sentinel实现统计、限流、熔断降级等功能由一个个ProcessorSlot完成,例如,统计资源当前时间窗口的请求总数、失败总数等由StatisticSlot完成,判断当前请求是否需要限流由GatewayFlowSlot完成,判断当前请求是否需要熔断降级由DegradeSlot完成。ProcessorSlot是顶级接口,有很多个xxxSlot实现类,如图:
ProcessorSlot的entry方法在接收到客户端请求时或者客户端向服务端发送请求之前被调用,exit方法则是在服务端处理完请求(包括异常完成)时或者客户端发送请求完成时被调用。每个ProcessorSlot通过fireEntry方法或者fireExit方法向下传递信号。
看过Netty源码的朋友应该对这种设计模式的使用并不陌生,Netty也是通过责任链模式将处理请求的Handler包装为链表,实现局部串行处理请求。但Sentinel的ProcessorSlot与Netty的Handler有些区别,ProcessorSlot的exit方法并不像Netty那样是从后往前传递的。
网关限流的处理流程
官网流程图:
我们重点从StatisticSlot开始,也是上图的Slot Chain 阶段,当客户端发起一个请求,首先会进入StatisticSlot的entry方法,entry方法内部会调用fireEntry方法,把请求传递给下一个Slot检测,StatisticSlot方法会有个BlockException异常捕获,当后面的Slot检测不通过会抛出BlockException异常表示请求被限流。
Slot的传递大概顺序:
StatisticSlot 一>AuthoritySlot一>SystemSlot一>GatewayFlowSlot
上面讲过判断当前请求是否需要限流由GatewayFlowSlot完成,具体是判断代码是:
该方法核心步骤:
1、根据资源名称去获取限流规则。
2、通过ParamFlowChecker检测类的passCheck检测方法判断是否需要限流。如果所有规则检测完成都不需要限流,会执行步骤3,如果passCheck判断需要限流,会返回false,退出循环,执行步骤4抛出异常。被StatisticSlot 类entry方法捕获。
ParamFlowChecker检测类的passCheck()检测方法解析:
1、passCheck方法会初步校验一下参数值并把检测对象传递给后续方法,这里会根据限流规则配置区分是集群限流(passClusterCheck())还是单机限流(passLocalCheck()),我们这里调试是单机限流。
2、passLocalCheck()方法经过简单的校验会传递给passSingleValueCheck()方法。
3、passSingleValueCheck()方法根据限流规则配置判断传递给passDefaultLocalCheck()方法
4、passDefaultLocalCheck()方法是最终判断是否需要限流算法地方。
如图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持,如有错误还请海涵并指正。
更多推荐
所有评论(0)