限流器
大约 2 分钟componentratelimitadaptive
概述
限流器是服务保护的核心机制之一,它通过智能控制客户端请求速率,有效预防系统过载,确保服务稳定运行。其核心原理在于设定访问频率阈值,当请求量突破预设上限时,系统将自动拦截超额请求。
Sponge 框架提供的自适应限流解决方案创新性地实现了基于系统资源(尤其是 CPU 利用率)的动态阈值调整机制。该功能不仅能有效防护 Web 和 gRPC 服务,更在多服务器部署场景下显著简化了限流配置管理。针对服务器集群中不同节点处理能力存在差异的实际情况,这种基于实时负载的自适应算法解决了传统方案需要为每台服务器手动调参的痛点。
开启自适应限流功能
配置
在 sponge 创建的服务中,限流组件默认是关闭的。
在configs
目录下 yaml 文件设置字段enableLimit
:
app:
enableLimit: true # 是否开启自适应限流,true:开启, false:关闭
在 Web 服务设置
对于web
服务,如果默认值不能满足要求,可以在internal/routers/routers.go
里的 RateLimit
中间件中,修改阈值和系统资源配额默认值,示例如下:
// limit middleware
if config.Get().App.EnableLimit {
r.Use(middleware.RateLimit(
//middleware.WithWindow(time.Second*5), // default 10s
//middleware.WithBucket(200), // default 100
//middleware.WithCPUThreshold(900), // default 800
))
}
在 gRPC 服务设置
对于gRPC
服务,如果默认值不能满足要求,可以在internal/server/grpc.go
里的 UnaryServerRateLimit
拦截器中, 修改阈值和系统资源配额默认值,示例如下:
// limit interceptor
if config.Get().App.EnableLimit {
unaryServerInterceptors = append(unaryServerInterceptors, interceptor.UnaryServerRateLimit(
//interceptor.WithWindow(time.Second*5), // default 10s
//interceptor.WithBucket(200), // default 100
//interceptor.WithCPUThreshold(900), // default 800
))
}