feat: 集成限流器到服务 #176
@@ -60,6 +60,21 @@ auth:
|
|||||||
access_ttl: 120 # Access Token 过期时间(分钟)
|
access_ttl: 120 # Access Token 过期时间(分钟)
|
||||||
refresh_ttl: 10080 # Refresh Token 过期时间(分钟),7 天
|
refresh_ttl: 10080 # Refresh Token 过期时间(分钟),7 天
|
||||||
|
|
||||||
|
ratelimit:
|
||||||
|
enabled: false # 是否启用限流
|
||||||
|
# WebSocket query 消息限流(核心,控制 AI 成本)
|
||||||
|
query:
|
||||||
|
capacity: 10 # 突发容量:允许连续发 10 个 query
|
||||||
|
rate: 0.2 # 填充速率:每 5 秒补充 1 个令牌
|
||||||
|
# REST API 登录限流(防暴力破解)
|
||||||
|
login:
|
||||||
|
capacity: 5 # 突发容量:允许连续 5 次登录尝试
|
||||||
|
rate: 0.1 # 填充速率:每 10 秒补充 1 次
|
||||||
|
# REST API 注册限流
|
||||||
|
register:
|
||||||
|
capacity: 3 # 突发容量:允许连续 3 次注册
|
||||||
|
rate: 0.05 # 填充速率:每 20 秒补充 1 次
|
||||||
|
|
||||||
log:
|
log:
|
||||||
level: info # debug / info / warn / error
|
level: info # debug / info / warn / error
|
||||||
format: console # console / json
|
format: console # console / json
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ type Config struct {
|
|||||||
Storage StorageConfig `mapstructure:"storage"`
|
Storage StorageConfig `mapstructure:"storage"`
|
||||||
Log LogConfig `mapstructure:"log"`
|
Log LogConfig `mapstructure:"log"`
|
||||||
Auth AuthConfig `mapstructure:"auth"`
|
Auth AuthConfig `mapstructure:"auth"`
|
||||||
|
RateLimit RateLimitConfig `mapstructure:"ratelimit"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// SessionConfig 会话管理配置。
|
// SessionConfig 会话管理配置。
|
||||||
@@ -120,6 +121,20 @@ type AuthConfig struct {
|
|||||||
RefreshTTL int `mapstructure:"refresh_ttl"` // Refresh Token 过期时间(分钟),默认 10080(7天)
|
RefreshTTL int `mapstructure:"refresh_ttl"` // Refresh Token 过期时间(分钟),默认 10080(7天)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RateLimitConfig 限流配置。
|
||||||
|
type RateLimitConfig struct {
|
||||||
|
Enabled bool `mapstructure:"enabled"`
|
||||||
|
Query BucketConfig `mapstructure:"query"`
|
||||||
|
Login BucketConfig `mapstructure:"login"`
|
||||||
|
Register BucketConfig `mapstructure:"register"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// BucketConfig 令牌桶配置。
|
||||||
|
type BucketConfig struct {
|
||||||
|
Capacity int `mapstructure:"capacity"` // 桶容量(突发上限)
|
||||||
|
Rate float64 `mapstructure:"rate"` // 每秒填充令牌数
|
||||||
|
}
|
||||||
|
|
||||||
// Load 加载配置。优先级:环境变量 > config.{env}.yaml > config.yaml > 默认值。
|
// Load 加载配置。优先级:环境变量 > config.{env}.yaml > config.yaml > 默认值。
|
||||||
// workDir 为项目根目录或 backend 目录,用于定位 .env 和 config.yaml。
|
// workDir 为项目根目录或 backend 目录,用于定位 .env 和 config.yaml。
|
||||||
func Load(workDir string) (*Config, error) {
|
func Load(workDir string) (*Config, error) {
|
||||||
@@ -218,6 +233,15 @@ func setDefaults(v *viper.Viper) {
|
|||||||
// log
|
// log
|
||||||
v.SetDefault("log.level", "info")
|
v.SetDefault("log.level", "info")
|
||||||
v.SetDefault("log.format", "console")
|
v.SetDefault("log.format", "console")
|
||||||
|
|
||||||
|
// ratelimit
|
||||||
|
v.SetDefault("ratelimit.enabled", false)
|
||||||
|
v.SetDefault("ratelimit.query.capacity", 10)
|
||||||
|
v.SetDefault("ratelimit.query.rate", 0.2)
|
||||||
|
v.SetDefault("ratelimit.login.capacity", 5)
|
||||||
|
v.SetDefault("ratelimit.login.rate", 0.1)
|
||||||
|
v.SetDefault("ratelimit.register.capacity", 3)
|
||||||
|
v.SetDefault("ratelimit.register.rate", 0.05)
|
||||||
}
|
}
|
||||||
|
|
||||||
// bindEnvVars 显式绑定敏感信息环境变量。
|
// bindEnvVars 显式绑定敏感信息环境变量。
|
||||||
|
|||||||
Reference in New Issue
Block a user