访问限流
引入依赖
参考文档:依赖引入
初始化 polaris.yaml
你需要在项目的根路径下创建一个 polaris.yaml 文件用于初始化 polaris-cpp SDK。polaris.yaml配置详细
SDK实例构建
当初始化好 polaris.yaml 文件之后,你可以直接使用 include polaris/limit.h, 使用polaris::LimitApi::CreateWithDefaultFile() 方法进行构造一个 LimitApi SDK 实例
#include "polaris/limit.h"
int main(int argc, char** argv) {
polaris::LimitApi* limit_api = polaris::LimitApi::CreateWithDefaultFile();
}
请求配额
/// @brief 限流配额请求
class QuotaRequest {
public:
/// @brief 设置服务命名空间
void SetServiceNamespace(const std::string& service_namespace);
/// @brief 设置服务名
void SetServiceName(const std::string& service_name);
/// @brief 设置标签用于选择限流配置
void SetLabels(const std::map<std::string, std::string>& labels);
/// @brief 设置请求需要分配的配额数量,可选,默认为1
void SetAcquireAmount(int amount);
/// @brief 设置请求超时时间,可选,单位ms,默认1000ms
void SetTimeout(uint64_t timeout);
/// @brief 设置请求所属的接口名,可选
void SetMethod(const std::string& method);
};
说明:
如果当前 QuotaRequest 还不支持 AddArgument 方法,同时服务端版本 >= 1.11.0,SetLabels 对应的 key 名称如下:
- 路径: $path
- 方法: $method
- 请求头: $header.{标签键}
- 请求参数: $query.{标签键}
- 主调服务: $caller_service
- 主调IP: $caller_ip
- 自定义: {标签键}
发起请求配额申请
你在接收到请求之后对 QuotaRequest 结构体完成初始化后,只需要调用 LimitAPI.GetQuota 方法即可完成本次请求配额的申请。
ret = limit_api->GetQuota(quota_request, response)
对于请求配额结果的结构体如下。
/// @brief 配额获取结果
enum QuotaResultCode {
kQuotaResultOk = 0, // 配额正常
kQuotaResultLimited, // 配额被限流
kQuotaResultWait // 需求需要等待重试
};
/// @brief 配额分配信息,sidecar模式下暂时不支持获取这些信息
struct QuotaResultInfo {
int64_t left_quota_; // 剩余配额
int64_t all_quota_; // 配置的配额
uint64_t duration_; // 配置周期
bool is_degrade_; // 是否降级
};
/// @brief 限流配额应答
class QuotaResponse {
public:
/// @brief 获取限流配额结果
QuotaResultCode GetResultCode() const;
/// @brief 获取配额分配信息
const QuotaResultInfo& GetQuotaResultInfo() const;
/// @brief 请求需要获取多长时间才能使用配额
uint64_t GetWaitTime() const;
};
分布式限流使用
如果要使用分布式限流,请先确保已经部署了北极星分布式限流 server
部署完后确认北极星控制台存在服务 命名空间: Polaris, 服务名: polaris.limiter。
确认完毕后,调整 polaris.yaml 配置文件,在控制台配置分布式限流规则,SDK 仍然使用 ret = limit_api->GetQuota(quota_request, response) 即可。
# 描述:限流相关配置
rateLimiter:
# 分布式限流时用于发现限流服务器,当规则中未配置限流集群时使用该配置
rateLimitCluster:
# 限流服务器集群所在命名空间
namespace: Polaris
# 限流服务器集群名字
service: polaris.limiter