Golang限流器是一种用于控制程序访问速度的工具,可以防止程序被过多的请求压垮。下面是一个基本的Golang限流器实现:
package main
import (
"fmt"
"time"
)
type Limiter struct {
rateLimit time.Duration
lastRequestTime time.Time
}
func NewLimiter(rateLimit time.Duration) *Limiter {
return &Limiter{
rateLimit: rateLimit,
lastRequestTime: time.Unix(0, 0),
}
}
func (l *Limiter) Wait() {
timeSinceLastRequest := time.Since(l.lastRequestTime)
timeToWait := l.rateLimit - timeSinceLastRequest
if timeToWait > 0 {
time.Sleep(timeToWait)
}
l.lastRequestTime = time.Now()
}
func main() {
// 创建限流器,每秒只允许一个请求
limiter := NewLimiter(time.Second)
for i := 0; i < 10; i++ {
// 等待一段时间以保持请求速率不超过限制
limiter.Wait()
fmt.Println("发送请求:", i+1)
}
}
在上面的例子中,我们首先定义了一个 Limiter
结构体来存储限流的相关信息。在 NewLimiter()
函数中,我们初始化了一个新的限流器,并将最后一个请求时间设置为 Unix 时间戳 0(即 January 1, 1970, 00:00:00 UTC)。
接下来,我们定义了 Wait()
函数,它会计算自上次请求以来所经过的时间,并将其与规定的速率进行比较。如果时间间隔小于限流器的速率,那么程序就会等待一段时间。如果时间间隔大于或等于限流器的速率,程序就会记录当前时间并继续执行。
最后,在主函数中,我们创建了一个新的限流器,并通过 for
循环来模拟多次请求。每次请求都需要在 limiter.Wait()
中等待一段时间以保证请求速率不超过限制。