Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
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 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 ¶
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 ¶
Allow 提供非 HTTP 场景(如 MQ 消费、定时任务、RPC 调用)的编程式限流入口。 key 为自定义限流维度标识,rule 为限流规则。返回 true 表示放行。 使用 concurrency 算法时,务必在处理结束后调用返回的 release 函数归还槽位。
func (*Manager) ReloadWith ¶
ReloadWith 使用给定配置替换当前配置,并清空已有限流器
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 数组构成,按声明顺序优先匹配,命中即用该规则,不再叠加全局规则。