ratelimit

package
v2.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 4, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Allow

func Allow(key string, rule Rule) (bool, func())

Allow 单例管理器的编程式限流入口,等价于 GetManager().Allow(...)

func RateLimit

func RateLimit() gin.HandlerFunc

RateLimit 返回限流中间件,配置从 application.yml 的 go.ratelimit 节点读取。

app.Router.Use(ratelimit.RateLimit())

未配置或 enabled=false 时中间件直接放行,无任何性能开销。

func RateLimitWith

func RateLimitWith(rules ...Rule) gin.HandlerFunc

RateLimitWith 使用代码指定的规则构建限流中间件(不读取 yml), 适用于对某个路由组单独施加限流策略的场景:

api.Use(ratelimit.RateLimitWith(ratelimit.Rule{
    Algorithm: ratelimit.AlgoConcurrency, MaxConcurrent: 10,
}))

Types

type Algorithm

type Algorithm string

Algorithm 限流算法

const (
	// AlgoTokenBucket 令牌桶:允许突发流量,按固定速率补充令牌
	AlgoTokenBucket Algorithm = "token_bucket"
	// AlgoSlidingWindow 滑动窗口:精确统计窗口内请求数,无临界突刺问题
	AlgoSlidingWindow Algorithm = "sliding_window"
	// AlgoConcurrency 最大并发数:信号量控制同时在处理的请求数
	AlgoConcurrency Algorithm = "concurrency"
)

type Config

type Config struct {
	// Enabled 是否启用限流
	Enabled bool `koanf:"enabled"`
	// Whitelist 白名单路径(前缀匹配),命中则完全跳过限流
	Whitelist []string `koanf:"whitelist"`
	// WhiteIps 白名单 IP,命中则完全跳过限流
	WhiteIps []string `koanf:"whiteIps"`
	// IdleTimeout 空闲限流器回收时间(秒),默认 600
	IdleTimeout int `koanf:"idleTimeout"`
	// Headers 是否在响应头中输出 X-RateLimit-* 信息
	Headers bool `koanf:"headers"`
	// Rules 独立规则列表
	Rules []Rule `koanf:"rules"`
	// contains filtered or unexported fields
}

Config 限流中间件配置,对应 application.yml 中 go.ratelimit 节点

func LoadConfig

func LoadConfig() *Config

LoadConfig 从 application.yml 的 go.ratelimit 节点读取限流配置。 未配置 go.ratelimit 节点时返回 Enabled=false 的配置,中间件将直接放行。

func LoadConfigFrom

func LoadConfigFrom(prefix string) *Config

LoadConfigFrom 从指定配置前缀读取限流配置,便于同一进程内挂载多组互不干扰的限流策略

type Dimension

type Dimension string

Dimension 限流维度,决定限流计数器的分组维度

const (
	// DimGlobal 全局共享一个限流器
	DimGlobal Dimension = "global"
	// DimIP 按客户端 IP 分别限流
	DimIP Dimension = "ip"
	// DimPath 按请求路径分别限流
	DimPath Dimension = "path"
	// DimIPPath 按 客户端IP + 请求路径 组合分别限流
	DimIPPath Dimension = "ip_path"
	// DimHeader 按指定请求头的值分别限流(如 X-User-Id、Authorization)
	DimHeader Dimension = "header"
)

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager 单例限流管理器。 全进程唯一,集中持有所有维度的限流器实例,并通过后台协程定期回收空闲限流器, 避免按 IP / 路径维度限流时限流器无限增长造成内存泄漏。

func GetManager

func GetManager() *Manager

GetManager 获取单例限流管理器,首次调用时自动从 application.yml 加载配置并启动回收协程

func (*Manager) Allow

func (m *Manager) Allow(key string, rule Rule) (bool, func())

Allow 提供非 HTTP 场景(如 MQ 消费、定时任务、RPC 调用)的编程式限流入口。 key 为自定义限流维度标识,rule 为限流规则。返回 true 表示放行。 使用 concurrency 算法时,务必在处理结束后调用返回的 release 函数归还槽位。

func (*Manager) Config

func (m *Manager) Config() *Config

Config 返回当前生效的限流配置

func (*Manager) Count

func (m *Manager) Count() int

Count 返回当前活跃限流器数量,可用于监控

func (*Manager) Handler

func (m *Manager) Handler() gin.HandlerFunc

Handler 生成该管理器对应的 gin 中间件

func (*Manager) Reload

func (m *Manager) Reload()

Reload 重新从配置中心/配置文件加载限流配置并重置所有限流器,用于配置热更新

func (*Manager) ReloadWith

func (m *Manager) ReloadWith(cfg *Config)

ReloadWith 使用给定配置替换当前配置,并清空已有限流器

func (*Manager) Stop

func (m *Manager) Stop()

Stop 停止回收协程,通常无需调用(进程退出即可)

type Rule

type Rule struct {
	// Name 规则名,用于限流器 key 前缀与统计展示;为空时自动以路径生成
	Name string `koanf:"name"`
	// Path 匹配路径。支持三种写法:
	//   精确匹配   /api/v1/user/info
	//   前缀匹配   /api/v1/sms/*
	//   Gin 路由    /api/v1/user/:id
	// 为空表示匹配所有路径
	Path string `koanf:"path"`
	// Methods 匹配的 HTTP 方法,为空表示不限方法
	Methods []string `koanf:"methods"`
	// Algorithm 限流算法,默认 token_bucket
	Algorithm Algorithm `koanf:"algorithm"`
	// Dimension 限流维度,默认 global
	Dimension Dimension `koanf:"dimension"`
	// HeaderKey Dimension 为 header 时读取的请求头名称
	HeaderKey string `koanf:"headerKey"`
	// Rate 令牌桶:每秒生成令牌数;滑动窗口:一个窗口内允许的请求数
	Rate float64 `koanf:"rate"`
	// Burst 令牌桶容量(可突发的最大请求数),为 0 时取 Rate 向上取整
	Burst int `koanf:"burst"`
	// Window 滑动窗口时长(秒),默认 1
	Window int `koanf:"window"`
	// WindowMs 滑动窗口时长(毫秒),优先于 Window
	WindowMs int `koanf:"windowMs"`
	// MaxConcurrent concurrency 算法的最大并发请求数
	MaxConcurrent int `koanf:"maxConcurrent"`
	// Wait 触发限流时是否排队等待而非立即拒绝
	Wait bool `koanf:"wait"`
	// WaitTimeoutMs 排队等待的最长时间(毫秒),超时后拒绝
	WaitTimeoutMs int `koanf:"waitTimeoutMs"`
	// Code 被限流时返回的业务状态码,默认 errcode.TOO_MANY_REQUESTS
	Code int `koanf:"code"`
	// Message 被限流时返回的提示信息
	Message string `koanf:"message"`
	// HttpStatus 被限流时的 HTTP 状态码,默认 200(框架统一用业务码表达错误)
	HttpStatus int `koanf:"httpStatus"`
	// contains filtered or unexported fields
}

Rule 一条限流规则。 全局规则由 go.ratelimit 下的一级配置项构成; 独立规则由 go.ratelimit.rules 数组构成,按声明顺序优先匹配,命中即用该规则,不再叠加全局规则。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL