访问限流
引入依赖
go get github.com/polarismesh/polaris-go@latest
初始化 polaris.yaml
你需要在项目的根路径下创建一个 polaris.yaml 文件用于初始化 polaris-go SDK。polaris.yaml配置详细
SDK实例构建
当初始化好 polaris.yaml 文件之后,你可以直接使用在 package github.com/polarismesh/polaris-go 下的 NewLimitAPI 方法进行构造一个 LimitAPI SDK 实例
import (
...
"github.com/polarismesh/polaris-go"
)
func main() {
limiter, err := polaris.NewLimitAPI()
}
请求配额
type QuotaRequest interface {
// SetNamespace 设置命名空间
SetNamespace(string)
// SetService 设置服务名
SetService(string)
// SetLabels 设置业务标签信息
// Deprecated: please use AddArgument instead
SetLabels(map[string]string)
// SetMethod set method
SetMethod(method string)
// AddArgument add the match argument
AddArgument(argument model.Argument)
// SetToken set token to acquire
SetToken(uint32)
// SetTimeout 设置单次请求超时时间
SetTimeout(timeout time.Duration)
// SetRetryCount 设置最大重试次数
SetRetryCount(retryCount int)
}
说明:
如果当前 QuotaRequest 还不支持 AddArgument 方法,同时服务端版本 >= 1.11.0,SetLabels 对应的 key 名称如下:
- 路径: $path
- 方法: $method
- 请求头: $header.{标签键}
- 请求参数: $query.{标签键}
- 主调服务: $caller_service
- 主调IP: $caller_ip
- 自定义: {标签键}
发起请求配额申请
你在接收到请求之后对 QuotaRequest 结构体完成初始化后,只需要调用 LimitAPI.GetQuota 方法即可完成本次请求配额的申请。
ret, err := limiter.GetQuota(QuotaRequest)
对于请求配额结果的结构体如下。
// QuotaFuture 实时/延时分配future
type QuotaFuture interface {
// Done 标识分配是否结束
Done() <-chan struct{}
// Get 等待一段时间后,获取分配结果,用于匀速排队
Get() *model.QuotaResponse
// GetImmediately 立刻获取分配结果,不等待
GetImmediately() *model.QuotaResponse
// Release 释放资源,仅用于并发数限流的场景
Release()
}
分布式限流使用
如果要使用分布式限流,请先确保已经部署了北极星分布式限流 server
部署完后确认北极星控制台存在服务 命名空间: Polaris, 服务名: polaris.limiter。
确认完毕后,调整 polaris.yaml 配置文件,在控制台配置分布式限流规则,SDK 仍然使用 ret, err := limiter.GetQuota(QuotaRequest) 即可。
provider:
rateLimit:
enable: true
limiterNamespace: Polaris
limiterService: polaris.limiter