基于令牌桶算法的 go 框架限流技术:使用 [ratelimiter](HTTPs://Github.com/juju/ratelimit) 框架实现。定义令牌桶,指定最大容量和每秒令牌发放速率。受限函数中获取令牌,如果失败则返回错误或重试。执行受限函数,并在完成后释放令牌。实战案例:使用率限制器限制 http 请求的并发数量。
基于令牌桶算法的 Go 框架限流
限流是一种流量控制技术,用于限制对资源或服务的并发访问。令牌桶算法是一种流行且简单的限流算法,它通过将令牌存储在桶中来实现,访问请求必须获取足够的令牌才能通过。
Go 框架中的限流
立即学习“go语言免费学习笔记(深入)”;
Go 中有多个框架支持基于令牌桶算法的限流。本文将重点介绍使用 [ratelimiter](HTTPS://github.com/juju/ratelimit) 框架。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import (
"context"
"sync"
"time"
"github.com/juju/ratelimit"
)
var bucket = ratelimit.NewBucket(time.Second, 10 )
func myRateLimitedFunction(ctx context.Context, wg *sync.WaitGroup) {
if err := bucket.take(ctx, 1 ); err != nil {
return
}
defer bucket. Return ( 1 )
wg.Done()
}
|
实战案例
以下是一个实战案例,演示了如何使用率限制器来限制 HTTP 请求的并发数量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import (
"context"
"net/http"
"sync"
"time"
"github.com/gorilla/mux"
"github.com/juju/ratelimit"
)
var bucket = ratelimit.NewBucket(time.Second, 10 )
func main() {
r := mux.NewRouter()
r.HandleFunc( "/API/v1/endpoint" , limitHandler)
http.Handle( "/" , r)
http.ListeNANDServe( ":8080" , nil )
}
func limitHandler(w http.ResponseWriter, r *http.Request) {
if err := bucket.Take(context.Background(), 1 ); err != nil {
http. Error (w, http.StatusTooManyRequests. String (), http.StatusTooManyRequests)
return
}
defer bucket. Return ( 1 )
}
|