流控php源码,Sentinle集群流控【源码笔记】

TokenService初始化的初始化由client/server两部分构成。

1.DefaultClusterTokenClient初始化

8b3e24bb88c5226a36e255585af721a7.png

@1

注册server变更观察者,在server变更时回调changeServer方法,此处可以借鉴如何使用观察者模式。

调用时机

下面以示例中给出的例子为入口切入,观察server变更时的回调流程。

e1e708843f7d648c9754ac3015139a9b.png

示例中使用动态数据源,在配置变更后执行getProperty().updateValue(newValue)让规则生效。

969aa074f6e0654fdcf094d8f6949cde.png

ClusterClientConfigManager通过静态方法clientAssignProperty注册ClientAssignPropertyListener,监听ClusterClientAssignConfig的变更,

主要是server地址和端口的变更

ClusterClientAssignConfig配置

serverHost:server地址serverPort:server端口

clientConfigProperty注册ClientConfigPropertyListener监听ClusterClientConfig的变更,

主要是超时时间

的变更。

ClusterClientConfig配置

requestTimeout:请求超时时间

5d925a5f07ef103c774bd320235929c9.png

27dfae98331ffe2c61694663562826a0.png

重新连接server

a7134ea9515acf27b632b5526c36c437.png

小结

:client初始化时注册观察者,在server配置(server地址与端口)变更时通过netty重新连接到新的server地址。

@2

初始化新连接,此处并未真正与server建立连接

a3907a6847e34c4a2c9e722ab6aece5e.png

e4f9bafd31ba8eceddc8126994412135.png

29928d8486fa65f7aa1538e583081ebc.png

说明

:通过ClusterStatePropertyListener进行状态变更时触发与server的连接;ClusterStatePropertyListener在ClusterStateManager初始化时被添加到stateProperty,主要负责client、server角色的切换。

下面示例demo中,通过监听动态配置,来动态切换client与server,判断逻辑见下图备注。

6cbb616efab165db35272b6adddadf04.png

小结

:监听client/server的动态配置,ClusterStatePropertyListener负责client/server的状态切换,即:如果本节点是server被变更为client,则先关闭server在启动client;反之同理。0表示client,1表示server,-1表示未启动。

2.DefaultEmbeddedTokenServer初始化

DefaultEmbeddedTokenServer启动时使用SentinelDefaultTokenServer。

0b846e91f7f249acb9c1158cc9e17318.png

@1注册观察者,通过动态数据源(zk、nacus等)监听serve端通信配置ServerTransportConfig配置的变更,有变更时重新启动server。

ServerTransportConfig配置信息

port:端口号idleSeconds:连接空闲时间,默认为600秒,超过会关闭连接

更新ServerTransportConfig生效由ClusterServerConfigManager#ServerGlobalTransportPropertyListener负责,用法见示例:

2c0d3316aaf716fc5d6afb066babbe19.png@2初始化集群流控server,使用netty通信

三、client/server交互

1.client发送令牌请求

5b9ed41a56264880adc90c4d7252b4ec.png

@1构造请求参数FlowRequestData

flowId:流控规则ID全局唯一标识count:需要的令牌数量,例如:QPS请求数priority:优先级,如果当前时间窗口令牌不够,是否预占用下个时间窗口的令牌,默认false。

@2通信通过netty向server端请求,返回结果TokenResult参数

status:返回状态,见TokenResultStatus枚举类。remaining:集群流控剩余令牌的数量waitInMs:当prioritized设置为true时,下个时间窗口分配令牌,需要等待的时间,单位毫秒attachments:保留扩展字段,未使用

@3记录错误日志,日志文件为sentinel-cluster-client.log

2.server处理令牌请求

处理请求入口

309853580d7df318cc02a3f975b436e2.png

处理请求过程

b5efd6f54c93e7c5fc189e87f669e54a.png

76f0817a37938c009607a5fad154beb8.png

@1请求允许通过尝试,GlobalRequestLimiter负责执行。当监听到namespace有新增时,ServerNamespaceSetPropertyListener#configUpdate更新生效。

b87e303c477e0bad01c7a0f914e316a4.png

通过namespace获取全局RequestLimiter,默认10个采样窗口,统计区间为1秒。

0d886496b724eeeba77008961e0596bf.png

089b18e4740c8a9fe75f06909748d77a.pngServerNamespaceSetPropertyListener更新过程

16795dfa23525fe82463a58efb3b051b.png

@1 集群流控为嵌入模式,默认将appName加入namespace@2 将过期失效的namespace流控规则移除@3 构建namespace、flowId、FlowRule、flowIdSet在缓存中的关系以及为每个flowId准备集群流控统计ClusterMetric,详见:FlowRulePropertyListener#applyClusterFlowRule@4 构建namespace、flowId、ParamFlowRule、flowIdSet在缓存中的关系以及为每个flowId准备集群热点参数流控统计ClusterParamMetric,详见:ParamRulePropertyListener#applyClusterParamRules@5 RequestLimiter初始化,GlobalRequestLimiter负责集群全局统计限速判断

@2根据flowId获取对应的集群流量统计信息ClusterMetric@3计算剩余的允许通过的令牌数 = 允许通过的令牌数阈值 * 限制倍数 - 已经使用的令牌 - 本次需要的令牌

允许通过的令牌数阈值

f75474ec6f4936a9fc524016c9d25ca4.png

exceedCount:限制倍数,默认1.0,可由ServerFlowConfig#exceedCount设置latestQps:已经使用的令牌acquireCount:本次需要的令牌

@4剩余令牌大于等于0,允许通过返回OK

@5如果设置了优先级prioritized,会占用下个时间窗口的令牌

@6无令牌可用,统计被阻塞请求并记录日志

@7返回阻塞结果BLOCKED

四、返回结果处理

f96ad89d3b268a095cbed1c0cf760b15.png

2438577df677b776cdb67fd8d2320f81.png

说明

OK:值为0,正产放行。允许通过

SHOULD_WAIT:值为2,当设置prioritized=true时预占下个时间窗口令牌需要等待的时间。允许通过

NO_RULE_EXISTS:值为3,缓存中根据flowId找不到FlowRule。不允许通过抛出FlowException

BAD_REQUEST:值为-4,flowId为null或者小于0,通过的请求count小于0,即入参问题。不允许通过抛出FlowException

FAIl:值为-1,内部发生异常了。不允许通过抛出FlowException

TOO_MANY_REQUEST:值为-2,本次请求直接超过设置允许的阈值,被拦回。不允许通过抛出FlowException

BLOCKED:值为1,请求被阻塞。不允许通过抛出FlowException

作者丨梁勇来源丨瓜农老梁欢迎关注公众号「瓜农老梁」

「瓜农老梁  学习同行」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值