Documentation
¶
Overview ¶
Package limitermgr 提供统一的限流管理功能,支持 Redis、内存和无限流三种驱动。
核心特性:
- 多驱动支持:支持 Redis(分布式限流)、Memory(本地内存限流)、None(无限流)三种限流驱动
- 统一接口:提供统一的 ILimiterManager 接口,便于切换限流实现
- 可观测性:内置日志、指标和链路追踪支持
- 滑动窗口:支持时间窗口内的请求数限制
- 剩余查询:支持查询剩余可访问次数
基本用法:
// 使用内存限流
mgr := limitermgr.NewLimiterManagerMemoryImpl(&limitermgr.MemoryLimiterConfig{})
defer mgr.Close()
ctx := context.Background()
// 检查是否允许通过(100次/分钟)
allowed, err := mgr.Allow(ctx, "user:123", 100, time.Minute)
if err != nil {
log.Fatal(err)
}
if !allowed {
log.Println("请求被限流")
}
// 获取剩余次数
remaining, err := mgr.GetRemaining(ctx, "user:123", 100, time.Minute)
if err != nil {
log.Fatal(err)
}
log.Printf("剩余可访问次数: %d", remaining)
使用 Redis 限流:
cfg := &limitermgr.RedisLimiterConfig{
Host: "localhost",
Port: 6379,
Password: "",
DB: 0,
}
mgr := limitermgr.NewLimiterManagerRedisImpl(cfg)
defer mgr.Close()
配置驱动类型:
// 通过 Build 函数创建
mgr, err := limitermgr.Build("memory", map[string]any{
"max_backups": 1000,
})
// 通过配置提供者创建
mgr, err := limitermgr.BuildWithConfigProvider(configProvider)
使用场景:
- API 接口请求频率限制
- 用户行为频率控制(如点赞、评论)
- 防止恶意请求和爬虫
- 资源使用配额管理
Index ¶
- Constants
- func ValidateContext(ctx context.Context) error
- func ValidateKey(key string) error
- func ValidateLimit(limit int) error
- func ValidateWindow(window time.Duration) error
- type ILimiterManager
- func Build(driverType string, driverConfig map[string]any, ...) (ILimiterManager, error)
- func BuildWithConfigProvider(configProvider configmgr.IConfigManager, loggerMgr loggermgr.ILoggerManager, ...) (ILimiterManager, error)
- func NewLimiterManagerMemoryImpl(loggerMgr loggermgr.ILoggerManager, ...) ILimiterManager
- func NewLimiterManagerRedisImpl(loggerMgr loggermgr.ILoggerManager, ...) ILimiterManager
- type LimiterConfig
- type MemoryLimiterConfig
- type RedisLimiterConfig
Constants ¶
const ( // 默认值 DefaultRedisHost = "localhost" DefaultRedisPort = 6379 DefaultRedisDB = 0 DefaultRedisMaxIdleConns = 10 DefaultRedisMaxOpenConns = 100 DefaultRedisConnMaxLifetime = 30 * time.Second DefaultMemoryMaxBackups = 1000 )
Variables ¶
This section is empty.
Functions ¶
func ValidateContext ¶
ValidateContext 验证上下文是否有效 确保传入的 context 不为 nil
Types ¶
type ILimiterManager ¶
type ILimiterManager interface {
common.IBaseManager
// Allow 检查是否允许通过限流
// ctx: 上下文
// key: 限流键(如用户ID、IP等)
// limit: 时间窗口内的最大请求数
// window: 时间窗口大小
// 返回: 允许返回 true,否则返回 false
Allow(ctx context.Context, key string, limit int, window time.Duration) (bool, error)
// GetRemaining 获取剩余可访问次数
// ctx: 上下文
// key: 限流键
// limit: 时间窗口内的最大请求数
// window: 时间窗口大小
// 返回: 剩余次数
GetRemaining(ctx context.Context, key string, limit int, window time.Duration) (int, error)
}
ILimiterManager 限流管理器接口
func Build ¶
func Build( driverType string, driverConfig map[string]any, loggerMgr loggermgr.ILoggerManager, telemetryMgr telemetrymgr.ITelemetryManager, cacheMgr cachemgr.ICacheManager, ) (ILimiterManager, error)
Build 创建限流管理器实例 driverType: 驱动类型 ("redis", "memory", "none") driverConfig: 驱动配置 (根据驱动类型不同而不同) loggerMgr: 日志管理器 telemetryMgr: 遥测管理器 cacheMgr: 缓存管理器(Redis 实现需要)
返回 ILimiterManager 接口实例和可能的错误
func BuildWithConfigProvider ¶
func BuildWithConfigProvider( configProvider configmgr.IConfigManager, loggerMgr loggermgr.ILoggerManager, telemetryMgr telemetrymgr.ITelemetryManager, cacheMgr cachemgr.ICacheManager, ) (ILimiterManager, error)
BuildWithConfigProvider 从配置提供者创建限流管理器实例 自动从配置提供者读取 limiter.driver 和对应驱动配置
参数:
- configProvider: 配置管理器
- loggerMgr: 日志管理器
- telemetryMgr: 遥测管理器
- cacheMgr: 缓存管理器(Redis 实现需要)
返回 ILimiterManager 接口实例和可能的错误
func NewLimiterManagerMemoryImpl ¶
func NewLimiterManagerMemoryImpl( loggerMgr loggermgr.ILoggerManager, telemetryMgr telemetrymgr.ITelemetryManager, ) ILimiterManager
NewLimiterManagerMemoryImpl 创建内存限流管理器实例 参数:
- loggerMgr: 日志管理器
- telemetryMgr: 遥测管理器
返回 ILimiterManager 接口实例
func NewLimiterManagerRedisImpl ¶
func NewLimiterManagerRedisImpl( loggerMgr loggermgr.ILoggerManager, telemetryMgr telemetrymgr.ITelemetryManager, cacheMgr cachemgr.ICacheManager, ) ILimiterManager
NewLimiterManagerRedisImpl 创建 Redis 限流管理器实例 参数:
- loggerMgr: 日志管理器
- telemetryMgr: 遥测管理器
- cacheMgr: 缓存管理器
返回 ILimiterManager 接口实例
type LimiterConfig ¶
type LimiterConfig struct {
Driver string `yaml:"driver"` // 驱动类型: redis, memory
RedisConfig *RedisLimiterConfig `yaml:"redis_config"` // Redis 配置
MemoryConfig *MemoryLimiterConfig `yaml:"memory_config"` // Memory 配置
}
LimiterConfig 限流配置
func ParseLimiterConfigFromMap ¶
func ParseLimiterConfigFromMap(cfg map[string]any) (*LimiterConfig, error)
ParseLimiterConfigFromMap 从 ConfigMap 解析限流配置 支持从 map[string]any 格式的配置中解析限流管理器配置
func (*LimiterConfig) Validate ¶
func (c *LimiterConfig) Validate() error
Validate 验证配置的有效性 检查驱动类型是否有效、对应的配置是否完整
type MemoryLimiterConfig ¶
type MemoryLimiterConfig struct {
MaxBackups int `yaml:"max_backups"` // 最大备份项数(清理策略相关)
}
MemoryLimiterConfig 内存限流配置
type RedisLimiterConfig ¶
type RedisLimiterConfig struct {
Host string `yaml:"host"` // Redis 主机地址
Port int `yaml:"port"` // Redis 端口
Password string `yaml:"password"` // Redis 密码
DB int `yaml:"db"` // Redis 数据库编号
MaxIdleConns int `yaml:"max_idle_conns"` // 最大空闲连接数
MaxOpenConns int `yaml:"max_open_conns"` // 最大打开连接数
ConnMaxLifetime time.Duration `yaml:"conn_max_lifetime"` // 连接最大存活时间
}
RedisLimiterConfig Redis 限流配置