設定伺服器的電流限制

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)