为服务器设置限流
1. 准备工作
- 已安装 dubbo-go cli 工具和依赖工具
- 创建一个新的演示应用程序
2. 修改限流逻辑并验证
Dubbo-go 为用户提供了内置的限流拒绝逻辑,并支持用户根据自身业务场景自定义所需的限流机制和拒绝逻辑。
正常情况下,不设置限流。当用户在服务器端配置限流逻辑和参数时,它将
2.1 配置限流参数
go-server/conf/dubbogo.yaml:配置限流参数
dubbo:
protocols:
triple:
name: tri
port: 20000
provider:
services:
GreeterProvider:
interface: "" # read from pb
tps.limiter: "method-service"
tps.limit.strategy: "slidingWindow"
tps.limit.rejected.handler: "default"
tps.limit.interval: 1000
tps.limit.rate: 3
参数说明
- tps.limiter:限流器选择。 method-service 是框架内置的限流器,可以配置服务和方法级别的限流逻辑,可以自定义。
- tps.limit.strategy:限流策略选择,slidingWindow 是框架内置的限流策略,可以以滑动窗口的形式拒绝窗口内超过流量限制的请求。
- tps.limit.rejected.handler:拒绝策略,默认是默认拒绝方法,返回一个空对象,可以自定义
- tps.limit.interval:限流窗口间隔,单位为毫秒。
- tps.limit.rate:窗口内的流量限制,单位为请求数。
根据以上配置,服务器只允许在一秒内调用当前接口三次。
2.2 发起超流量请求以验证限流能力
将客户端的请求逻辑设置为每秒请求五次,并计算成功率。
go-client/cmd/client.go
func main() {
config. SetConsumerService(grpcGreeterImpl)
if err := config.Load(); err != nil {
panic(err)
}
logger.Info("start to test dubbo")
req := &api.HelloRequest{
Name: "Laurence",
}
for {
goodCount := 0
badCount := 0
for {
time.Sleep(time.Millisecond*200)
reply, _ := grpcGreeterImpl.SayHello(context.Background(), req)
if reply.Name == "" {
badCount++
} else {
goodCount++
}
if badCount + goodCount == 5{
break
}
}
logger.Infof("Success rate = %v\n", float64(goodCount)/float64(goodCount + badCount))
}
}
从日志中可以看出,请求成功率为 0.6,每秒只允许执行三个请求。
INFO cmd/client.go:62 Success rate = 0.6
INFO cmd/client.go:62 Success rate = 0.6
INFO cmd/client.go:62 Success rate = 0.6
您可以在服务器日志中看到拒绝信息
ERROR tps/filter.go:84 The invocation was rejected due to over the limiter limitation...
上次修改时间:2023 年 1 月 2 日:增强 Dubbogo 文档 (#1800) (71c8e722740)