本文将介绍如何在 gRPC 微服务中实现【限流】拦截器/中间件。
我们将会使用 rk-boot 来启动 gRPC 服务。
请访问如下地址获取完整教程:
go get github.com/rookie-ninja/rk-boot
go get github.com/rookie-ninja/rk-grpc
为了验证,我们启动了 commonService,commonService 里包含了一系列常用 API,例如 /rk/v1/healthy。
我们针对 /rk.api.v1.RkCommonService/Healthy 进行限流处理,设置成 0,其他 API 设置成 100。
---
grpc:
- name: greeter # Name of grpc entry
port: 8080 # Port of grpc entry
enabled: true # Enable grpc entry
commonService:
enabled: true # Enable common service for testing
interceptors:
rateLimit:
enabled: true
reqPerSec: 100
# algorithm: "leakyBucket"
paths:
- path: "/rk.api.v1.RkCommonService/Healthy"
reqPerSec: 0
package main
import (
"context"
"github.com/rookie-ninja/rk-boot"
_ "github.com/rookie-ninja/rk-grpc/boot"
)
// Application entrance.
func main() {
// Create a new boot instance.
boot := rkboot.NewBoot()
// Bootstrap
boot.Bootstrap(context.Background())
// Wait for shutdown sig
boot.WaitForShutdownSig(context.Background())
}
$ tree
.
├── boot.yaml
├── go.mod
├── go.sum
└── main.go
0 directories, 4 files
$ go run main.go
{
"code":8,
"message":"Slow down your request.",
"details":[
{
"@type":"type.googleapis.com/rk.api.v1.ErrorDetail",
"code":8,
"status":"ResourceExhausted",
"message":"[from-grpc] Slow down your request."
}
]
}
{
"appName":"demo",
"az":"",
"description":"Internal RK entry which describes application with fields of appName, version and etc.",
"docsUrl":[
],
"domain":"",
"gid":"20",
"homeUrl":"",
"iconUrl":"",
"keywords":[
],
"maintainers":[
],
"realm":"",
"region":"",
"startTime":"2021-10-25T01:15:48+08:00",
"uid":"501",
"upTimeSec":76,
"upTimeStr":"1 minute",
"username":"Dongxun Yin",
"version":"master-557da30"
}
名字 | 描述 | 类型 | 默认值 |
---|---|---|---|
grpc.interceptors.rateLimit.enabled | 启动限流兰姐去 | boolean | false |
grpc.interceptors.rateLimit.algorithm | 限流算法, 支持 tokenBucket 和 leakyBucket | string | tokenBucket |
grpc.interceptors.rateLimit.reqPerSec | 全局限流值 | int | 0 |
grpc.interceptors.rateLimit.paths.path | gRPC 方法路径 | string | "" |
grpc.interceptors.rateLimit.paths.reqPerSec | 基于 gRPC 方法路径的限流值 | int | 0 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。