Files
alibaba--nacos/specs/zh-cn/plugin/default-control-plugin-spec.md
2026-07-13 12:37:52 +08:00

4.2 KiB
Raw Permalink Blame History

默认 Control 插件实现规范

范围

默认 Control 实现是 plugin-default-impl/nacos-default-control-plugin 中的 nacos 插件。它为单个 Nacos 服务端节点提供简单的本地连接数限制和 TPS 限制,是 Control 插件规范的内置实现。

该实现是节点本地的,不自行提供集群级配额协调。集群级规则分发需要外部规则存储插件, 或由运维系统在该实现之外完成同步。

启用方式

通过以下配置启用:

nacos.plugin.control.manager.type=nacos

如果该配置不存在,control manager center 使用无上限 manager。如果 nacos builder 创建任一 manager 失败,该 manager 会回退到无上限实现并记录日志。

本地规则文件

默认实现从以下位置读取本地 JSON 规则文件:

${nacos.home}/data/connection/limitRule
${nacos.home}/data/tps/{pointName}

基准目录可以通过以下配置修改:

nacos.plugin.control.rule.local.basedir=${expectedDir}

修改后,规则文件从以下位置读取:

${expectedDir}/data/connection/limitRule
${expectedDir}/data/tps/{pointName}

连接规则示例:

{"countLimit":100}

TPS 规则示例:

{"pointName":"ConfigQuery","pointRule":{"maxCount":100,"monitorType":"intercept"}}

连接行为

NacosConnectionControlManager 会汇总所有已加载 ConnectionMetricsCollector 的计数。 如果 countLimit 小于 0,连接被允许。如果当前总连接数大于或等于 countLimit 连接检查会以 DENY_BY_TOTAL_OVER 拒绝。

monitorIpList 属于规则模型,但具体 IP 维度行为取决于指标采集器和 remote 模块集成。

TPS 行为

NacosTpsControlManager 注册 TPS point,并为每个 point 创建一个 barrier。注册 point 时如果存在规则文本,会应用该规则;后续也可以通过规则变更事件应用更新后的规则。

默认 barrier 会定期把通过与拒绝计数输出到 TPS 日志。如果某个 point 没有注册 barrier, 或 TPS 应用过程失败,检查会跳过并允许请求继续。 TPS 和拒绝观测属于运维指标,必须遵循 可观测钩子规范

内置 Point Name

当前代码通过 @TpsControl 注册以下 point name

  • Config: ConfigQuery, ConfigPublish, ConfigRemove, ConfigListen, ConfigFuzzyWatch, ClusterConfigChangeNotify
  • Naming gRPC: RemoteNamingInstanceRegisterDeregister, RemoteNamingInstanceBatchRegister, RemoteNamingServiceQuery, RemoteNamingServiceListQuery, RemoteNamingServiceSubscribeUnSubscribe
  • Naming HTTP: NamingInstanceRegister, NamingInstanceDeregister, NamingInstanceUpdate, NamingInstanceMetadataUpdate, NamingServiceSubscribe, NamingInstanceQuery, NamingServiceRegister, NamingServiceDeregister, NamingServiceQuery, NamingServiceListQuery, NamingServiceUpdate
  • Core: HealthCheck

Point name 一旦文档化就必须保持稳定,因为规则文件和外部规则存储都会把它作为 key。

规则重载

规则可以通过以下方式重载:

  • 调用 ControlManagerCenter.reloadTpsControlRule(pointName, external)
  • 调用 ControlManagerCenter.reloadConnectionControlRule(external)
  • 发布 TpsControlRuleChangeEventConnectionLimitRuleChangeEvent

当配置了外部规则存储插件时,external 标记决定是否从外部存储读取规则。 规则变更事件是进程内本地事件,并遵循 事件分发与 NotifyCenter 规范