ratelimit

package
v0.7.0 Latest Latest
Warning

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

Go to latest
Published: Aug 10, 2026 License: Apache-2.0 Imports: 18 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrRateLimitExceeded 超过限流阈值错误
	ErrRateLimitExceeded = errors.New("rate limit exceeded")
	// ErrRateLimiterNotFound 限流器未找到错误
	ErrRateLimiterNotFound = errors.New("rate limiter not found")
)

Functions

func GetRateLimitStats

func GetRateLimitStats() map[string]RateLimitStats

GetRateLimitStats 从默认管理器获取统计信息

func HTTPClientMiddleware

func HTTPClientMiddleware(rl *RateLimitMiddleware) func(http.RoundTripper) http.RoundTripper

HTTPClientMiddleware 返回 HTTP 客户端限流中间件

func HTTPMiddleware

func HTTPMiddleware(rl *RateLimitMiddleware) func(http.Handler) http.Handler

HTTPMiddleware 返回 HTTP 限流中间件

func HTTPWaitMiddleware

func HTTPWaitMiddleware(rl *RateLimitMiddleware) func(http.Handler) http.Handler

HTTPWaitMiddleware 返回等待型 HTTP 限流中间件(会等待而不是直接拒绝)

func IsGRPCRateLimitError

func IsGRPCRateLimitError(err error) bool

IsGRPCRateLimitError 检查错误是否为 gRPC 限流相关错误

func IsHTTPRateLimitError

func IsHTTPRateLimitError(err error) bool

IsHTTPRateLimitError 检查错误是否为 HTTP 限流错误

func IsRateLimitError

func IsRateLimitError(err error) bool

IsRateLimitError 检查错误是否为限流相关错误

func OptionalRateLimit

func OptionalRateLimit(rl *RateLimitMiddleware) func(http.Handler) http.Handler

OptionalRateLimit 创建可选限流中间件(限流失败不会阻止请求,但会记录)

func RateLimitInfo

func RateLimitInfo(rl *RateLimitMiddleware) func(http.Handler) http.Handler

RateLimitInfo 限流信息中间件(添加限流状态头部)

func RequireRateLimit

func RequireRateLimit(rl *RateLimitMiddleware) func(http.Handler) http.Handler

RequireRateLimit 创建需要限流检查的中间件(用于特定路由)

func ResetAllRateLimitStats

func ResetAllRateLimitStats()

ResetAllRateLimitStats 重置默认管理器中的所有限流中间件统计信息

func ResetRateLimitStats

func ResetRateLimitStats(name string) bool

ResetRateLimitStats 重置默认管理器中的限流中间件统计信息

func StreamClientInterceptor

func StreamClientInterceptor(rl *RateLimitMiddleware) grpc.StreamClientInterceptor

StreamClientInterceptor 返回一个 gRPC 流客户端拦截器,用于限流

func StreamServerInterceptor

func StreamServerInterceptor(rl *RateLimitMiddleware) grpc.StreamServerInterceptor

StreamServerInterceptor 返回一个 gRPC 流服务器拦截器,用于限流

func UnaryClientInterceptor

func UnaryClientInterceptor(rl *RateLimitMiddleware) grpc.UnaryClientInterceptor

UnaryClientInterceptor 返回一个 gRPC 一元客户端拦截器,用于限流

func UnaryServerInterceptor

func UnaryServerInterceptor(rl *RateLimitMiddleware) grpc.UnaryServerInterceptor

UnaryServerInterceptor 返回一个 gRPC 一元服务器拦截器,用于限流

func UnaryServerWaitInterceptor

func UnaryServerWaitInterceptor(rl *RateLimitMiddleware) grpc.UnaryServerInterceptor

UnaryServerWaitInterceptor 返回等待型一元服务器拦截器(会等待而不是直接拒绝)

func UpdateRateLimit

func UpdateRateLimit(name string, newRate float64, newBurst int) bool

UpdateRateLimit 更新默认管理器中的限流率

Types

type CallbackKeyExtractor

type CallbackKeyExtractor struct {
	ExtractFunc func(ctx context.Context, metadata map[string]any) (string, error)
}

CallbackKeyExtractor 回调键提取器(允许业务方自定义提取逻辑)

func NewCallbackKeyExtractor

func NewCallbackKeyExtractor(extractFunc func(ctx context.Context, metadata map[string]any) (string, error)) *CallbackKeyExtractor

NewCallbackKeyExtractor 创建回调键提取器

func (*CallbackKeyExtractor) Extract

func (e *CallbackKeyExtractor) Extract(ctx context.Context, metadata map[string]any) (string, error)

Extract 执行回调提取键

type ChainKeyExtractor

type ChainKeyExtractor struct {
	Extractors []KeyExtractor
}

ChainKeyExtractor 链式键提取器(按顺序尝试多个提取器,返回第一个成功的结果)

func NewChainKeyExtractor

func NewChainKeyExtractor(extractors ...KeyExtractor) *ChainKeyExtractor

NewChainKeyExtractor 创建链式键提取器

func (*ChainKeyExtractor) Extract

func (e *ChainKeyExtractor) Extract(ctx context.Context, metadata map[string]any) (string, error)

Extract 按顺序尝试多个提取器

type CompositeKeyExtractor

type CompositeKeyExtractor struct {
	Extractors []KeyExtractor
	Separator  string
	Prefix     string
}

CompositeKeyExtractor 复合键提取器(组合多个提取器的结果)

func NewCompositeKeyExtractor

func NewCompositeKeyExtractor(separator, prefix string, extractors ...KeyExtractor) *CompositeKeyExtractor

NewCompositeKeyExtractor 创建复合键提取器

func (*CompositeKeyExtractor) Extract

func (e *CompositeKeyExtractor) Extract(ctx context.Context, metadata map[string]any) (string, error)

Extract 组合多个提取器的结果

type Config

type Config struct {
	Name          string
	Rate          float64
	Burst         int
	KeyExtractor  KeyExtractor
	EnableMetrics bool
	OnRateLimit   func(ctx context.Context, key string, rate float64)
	DefaultKey    string

	// IdleTTL 一个 key 多久没有请求后被回收,默认 10 分钟。
	// 设为 0 禁用 GC(适合 key 数量固定的场景)。
	IdleTTL time.Duration
	// GCInterval GC 扫描间隔,默认 5 分钟。
	GCInterval time.Duration
}

Config 限流配置

type HashKeyExtractor

type HashKeyExtractor struct {
	Extractor KeyExtractor
	Prefix    string
}

HashKeyExtractor 哈希键提取器(对提取的键进行 MD5 哈希)

func NewHashKeyExtractor

func NewHashKeyExtractor(extractor KeyExtractor, prefix string) *HashKeyExtractor

NewHashKeyExtractor 创建哈希键提取器

func (*HashKeyExtractor) Extract

func (e *HashKeyExtractor) Extract(ctx context.Context, metadata map[string]any) (string, error)

Extract 提取键并进行哈希

type HeaderKeyExtractor

type HeaderKeyExtractor struct {
	// HeaderName Header 名称
	HeaderName string
	// Prefix 键前缀
	Prefix string
}

HeaderKeyExtractor HTTP Header 键提取器

func NewHeaderKeyExtractor

func NewHeaderKeyExtractor(headerName, prefix string) *HeaderKeyExtractor

NewHeaderKeyExtractor 创建 Header 键提取器

func (*HeaderKeyExtractor) Extract

func (e *HeaderKeyExtractor) Extract(ctx context.Context, metadata map[string]any) (string, error)

Extract 从 HTTP Header 中提取键

type IPKeyExtractor

type IPKeyExtractor struct {
	// UseXForwardedFor 是否使用 X-Forwarded-For 头
	UseXForwardedFor bool
	// UseXRealIP 是否使用 X-Real-IP 头
	UseXRealIP bool
}

IPKeyExtractor IP 地址键提取器

func NewIPKeyExtractor

func NewIPKeyExtractor() *IPKeyExtractor

NewIPKeyExtractor 创建 IP 地址键提取器

func (*IPKeyExtractor) Extract

func (e *IPKeyExtractor) Extract(ctx context.Context, metadata map[string]any) (string, error)

Extract 从请求中提取 IP 地址作为键

type KeyExtractor

type KeyExtractor interface {
	Extract(ctx context.Context, metadata map[string]any) (string, error)
}

KeyExtractor 键提取器接口,用于从请求中提取限流键

type Limiter

type Limiter interface {
	Allow() bool
	Wait(ctx context.Context) error
	Reserve() *rate.Reservation
	Limit() rate.Limit
	Burst() int
}

Limiter 限流器接口

type Manager

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

Manager 限流中间件管理器

func NewManager

func NewManager(config ManagerConfig) *Manager

NewManager 创建限流中间件管理器

func (*Manager) Get

func (m *Manager) Get(name string) (*RateLimitMiddleware, bool)

Get 获取限流中间件

func (*Manager) GetOrCreate

func (m *Manager) GetOrCreate(name string, rate ...float64) *RateLimitMiddleware

GetOrCreate 获取或创建限流中间件

func (*Manager) List

func (m *Manager) List() []string

List 列出所有限流中间件名称

func (*Manager) Remove

func (m *Manager) Remove(name string) bool

Remove 移除限流中间件

func (*Manager) ResetStats

func (m *Manager) ResetStats()

ResetStats 重置所有限流中间件的统计信息

func (*Manager) ResetStatsByName

func (m *Manager) ResetStatsByName(name string) bool

ResetStatsByName 重置指定名称的限流中间件统计信息

func (*Manager) Stats

func (m *Manager) Stats() map[string]RateLimitStats

Stats 获取所有限流中间件的统计信息

func (*Manager) UpdateRate

func (m *Manager) UpdateRate(name string, newRate float64, newBurst int) bool

UpdateRate 更新指定中间件的限流率

type ManagerConfig

type ManagerConfig struct {
	// DefaultRate 默认限流速率
	DefaultRate float64
	// DefaultBurst 默认突发容量
	DefaultBurst int
	// DefaultKeyExtractor 默认键提取器
	DefaultKeyExtractor KeyExtractor
	// EnableLogging 是否启用日志
	EnableLogging bool
	// EnableMetrics 是否启用指标统计
	EnableMetrics bool
}

ManagerConfig 管理器配置

type PathKeyExtractor

type PathKeyExtractor struct {
	// Prefix 键前缀
	Prefix string
	// StripQuery 是否去除查询参数
	StripQuery bool
}

PathKeyExtractor 路径键提取器

func NewPathKeyExtractor

func NewPathKeyExtractor(prefix string, stripQuery bool) *PathKeyExtractor

NewPathKeyExtractor 创建路径键提取器

func (*PathKeyExtractor) Extract

func (e *PathKeyExtractor) Extract(ctx context.Context, metadata map[string]any) (string, error)

Extract 从请求路径中提取键

type RateLimitMiddleware

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

RateLimitMiddleware 限流中间件

func GetRateLimitMiddleware

func GetRateLimitMiddleware(name string, rate ...float64) *RateLimitMiddleware

GetRateLimitMiddleware 从默认管理器获取或创建限流中间件

func NewRateLimitMiddleware

func NewRateLimitMiddleware(config Config) *RateLimitMiddleware

NewRateLimitMiddleware 创建限流中间件。 GC 不会自动启动——将返回值传给 beauty.WithComponent 可接入框架生命周期自动启停; 也可手动调用 StartGC(ctx)。

func (*RateLimitMiddleware) Allow

func (rl *RateLimitMiddleware) Allow(ctx context.Context, metadata map[string]any) error

Allow 检查请求是否允许通过

func (*RateLimitMiddleware) Burst

func (rl *RateLimitMiddleware) Burst() int

Burst 返回突发容量

func (*RateLimitMiddleware) ClearLimiters

func (rl *RateLimitMiddleware) ClearLimiters()

ClearLimiters 立即清空所有 limiter(释放内存)

func (*RateLimitMiddleware) GetActiveLimiters

func (rl *RateLimitMiddleware) GetActiveLimiters() []string

GetActiveLimiters 返回当前所有活跃 key 列表

func (*RateLimitMiddleware) Init

Init 实现 core.Component 接口,启动后台 GC goroutine。 Name() 已在上方声明,两个方法合起来满足 core.Component 接口。 通过 beauty.WithComponent(rl) 接入框架后,GC 随应用启动/停止自动管理,无需手动调用 StartGC。

用法:

rl := ratelimit.NewRateLimitMiddleware(cfg)
app := beauty.New(
    beauty.WithComponent(rl),           // 自动启停 GC
    beauty.WithWebServer(":8080", mux,
        webserver.WithMiddleware(ratelimit.HTTPMiddleware(rl)),
    ),
)

func (*RateLimitMiddleware) LimitRate

func (rl *RateLimitMiddleware) LimitRate() float64

LimitRate 返回限流率

func (*RateLimitMiddleware) Name

func (rl *RateLimitMiddleware) Name() string

Name 返回中间件名称

func (*RateLimitMiddleware) ResetStats

func (rl *RateLimitMiddleware) ResetStats()

ResetStats 重置统计信息

func (*RateLimitMiddleware) StartGC

func (rl *RateLimitMiddleware) StartGC(ctx context.Context)

StartGC 启动后台 GC,ctx 取消时停止。 通常在应用启动时调用一次;若 IdleTTL == 0 则为空操作。

func (*RateLimitMiddleware) Stats

func (rl *RateLimitMiddleware) Stats() Stats

Stats 返回统计信息快照

func (*RateLimitMiddleware) String

func (rl *RateLimitMiddleware) String() string

func (*RateLimitMiddleware) UpdateRate

func (rl *RateLimitMiddleware) UpdateRate(newRate float64, newBurst int)

UpdateRate 运行时更新限流参数,同时刷新所有已存在的 limiter。

func (*RateLimitMiddleware) Wait

func (rl *RateLimitMiddleware) Wait(ctx context.Context, metadata map[string]any) error

Wait 等待直到可以处理请求

type RateLimitStats

type RateLimitStats struct {
	Name           string   `json:"name"`
	Rate           float64  `json:"rate"`
	Burst          int      `json:"burst"`
	Stats          Stats    `json:"stats"`
	ActiveLimiters []string `json:"active_limiters"`
}

RateLimitStats 限流统计信息

func (RateLimitStats) String

func (s RateLimitStats) String() string

String 返回统计信息的字符串表示

type Stats

type Stats struct {
	TotalRequests   uint64            `json:"total_requests"`
	AllowedRequests uint64            `json:"allowed_requests"`
	LimitedRequests uint64            `json:"limited_requests"`
	ActiveLimiters  int               `json:"active_limiters"`
	LimiterStats    map[string]uint64 `json:"limiter_stats"`
	LastLimitTime   time.Time         `json:"last_limit_time"`
}

Stats 限流统计信息

type UserKeyExtractor

type UserKeyExtractor struct {
	// UserIDKey 用户ID在元数据中的键名
	UserIDKey string
}

UserKeyExtractor 用户键提取器(基于用户ID)

func NewUserKeyExtractor

func NewUserKeyExtractor(userIDKey string) *UserKeyExtractor

NewUserKeyExtractor 创建用户键提取器

func (*UserKeyExtractor) Extract

func (e *UserKeyExtractor) Extract(ctx context.Context, metadata map[string]any) (string, error)

Extract 从请求中提取用户ID作为键

Jump to

Keyboard shortcuts

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