IP白名单优化
This commit is contained in:
@@ -19,12 +19,13 @@ const (
|
|||||||
|
|
||||||
// IPRateLimiter IP限流器结构体
|
// IPRateLimiter IP限流器结构体
|
||||||
type IPRateLimiter struct {
|
type IPRateLimiter struct {
|
||||||
ips map[string]*rateLimiterEntry
|
ips map[string]*rateLimiterEntry
|
||||||
mu *sync.RWMutex
|
mu *sync.RWMutex
|
||||||
r rate.Limit
|
r rate.Limit
|
||||||
b int
|
b int
|
||||||
whitelist []*net.IPNet
|
whitelist []*net.IPNet
|
||||||
blacklist []*net.IPNet
|
blacklist []*net.IPNet
|
||||||
|
whitelistLimiter *rate.Limiter // 全局共享的白名单限流器
|
||||||
}
|
}
|
||||||
|
|
||||||
// rateLimiterEntry 限流器条目
|
// rateLimiterEntry 限流器条目
|
||||||
@@ -75,12 +76,13 @@ func InitGlobalLimiter() *IPRateLimiter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
limiter := &IPRateLimiter{
|
limiter := &IPRateLimiter{
|
||||||
ips: make(map[string]*rateLimiterEntry),
|
ips: make(map[string]*rateLimiterEntry),
|
||||||
mu: &sync.RWMutex{},
|
mu: &sync.RWMutex{},
|
||||||
r: ratePerSecond,
|
r: ratePerSecond,
|
||||||
b: burstSize,
|
b: burstSize,
|
||||||
whitelist: whitelist,
|
whitelist: whitelist,
|
||||||
blacklist: blacklist,
|
blacklist: blacklist,
|
||||||
|
whitelistLimiter: rate.NewLimiter(rate.Inf, burstSize),
|
||||||
}
|
}
|
||||||
|
|
||||||
go limiter.cleanupRoutine()
|
go limiter.cleanupRoutine()
|
||||||
@@ -170,7 +172,7 @@ func (i *IPRateLimiter) GetLimiter(ip string) (*rate.Limiter, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if isIPInCIDRList(cleanIP, i.whitelist) {
|
if isIPInCIDRList(cleanIP, i.whitelist) {
|
||||||
return rate.NewLimiter(rate.Inf, i.b), true
|
return i.whitelistLimiter, true
|
||||||
}
|
}
|
||||||
|
|
||||||
normalizedIP := normalizeIPForRateLimit(cleanIP)
|
normalizedIP := normalizeIPForRateLimit(cleanIP)
|
||||||
|
|||||||
Reference in New Issue
Block a user