代码拉取完成,页面将自动刷新
package ratelimit
import (
"context"
"github.com/zeromicro/go-zero/core/syncx"
"google.golang.org/grpc"
"time"
)
// 令牌桶
type TokenBucketLimiter struct {
tokens chan struct{}
ch chan struct{}
}
func NewTokenBucketLimiter(capacity int, interval time.Duration) *TokenBucketLimiter {
tokens := make(chan struct{}, capacity)
closeCh := make(chan struct{})
ticker := time.NewTicker(interval)
go func() {
defer ticker.Stop()
for {
select {
case <-ticker.C:
select {
case tokens <- struct{}{}:
default:
}
case <-closeCh:
break
default:
}
}
}()
return &TokenBucketLimiter{
tokens: tokens,
ch: closeCh,
}
}
func (t *TokenBucketLimiter) Build() grpc.UnaryServerInterceptor {
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
select {
case <-t.ch:
/// 关闭了limiter,直接通过
resp, err = handler(ctx, req)
case <-t.tokens:
resp, err = handler(ctx, req)
case <-ctx.Done():
err = ctx.Err()
}
return
}
}
func (t *TokenBucketLimiter) Close() {
syncx.Once(func() {
close(t.ch)
})
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。