访问限流

引入依赖

参考文档:依赖引入

初始化 polaris.yaml

你需要在项目的根路径下创建一个 polaris.yaml 文件用于初始化 polaris-cpp SDK。polaris.yaml配置详细

SDK实例构建

当初始化好 polaris.yaml 文件之后,你可以直接使用 include polaris/limit.h, 使用polaris::LimitApi::CreateWithDefaultFile() 方法进行构造一个 LimitApi SDK 实例

  1. #include "polaris/limit.h"
  2. int main(int argc, char** argv) {
  3. polaris::LimitApi* limit_api = polaris::LimitApi::CreateWithDefaultFile();
  4. }

请求配额

  1. /// @brief 限流配额请求
  2. class QuotaRequest {
  3. public:
  4. /// @brief 设置服务命名空间
  5. void SetServiceNamespace(const std::string& service_namespace);
  6. /// @brief 设置服务名
  7. void SetServiceName(const std::string& service_name);
  8. /// @brief 设置标签用于选择限流配置
  9. void SetLabels(const std::map<std::string, std::string>& labels);
  10. /// @brief 设置请求需要分配的配额数量,可选,默认为1
  11. void SetAcquireAmount(int amount);
  12. /// @brief 设置请求超时时间,可选,单位ms,默认1000ms
  13. void SetTimeout(uint64_t timeout);
  14. /// @brief 设置请求所属的接口名,可选
  15. void SetMethod(const std::string& method);
  16. };

说明:

如果当前 QuotaRequest 还不支持 AddArgument 方法,同时服务端版本 >= 1.11.0,SetLabels 对应的 key 名称如下:

  • 路径: $path
  • 方法: $method
  • 请求头: $header.{标签键}
  • 请求参数: $query.{标签键}
  • 主调服务: $caller_service
  • 主调IP: $caller_ip
  • 自定义: {标签键}

发起请求配额申请

你在接收到请求之后对 QuotaRequest 结构体完成初始化后,只需要调用 LimitAPI.GetQuota 方法即可完成本次请求配额的申请。

  1. ret = limit_api->GetQuota(quota_request, response)

对于请求配额结果的结构体如下。

  1. /// @brief 配额获取结果
  2. enum QuotaResultCode {
  3. kQuotaResultOk = 0, // 配额正常
  4. kQuotaResultLimited, // 配额被限流
  5. kQuotaResultWait // 需求需要等待重试
  6. };
  7. /// @brief 配额分配信息,sidecar模式下暂时不支持获取这些信息
  8. struct QuotaResultInfo {
  9. int64_t left_quota_; // 剩余配额
  10. int64_t all_quota_; // 配置的配额
  11. uint64_t duration_; // 配置周期
  12. bool is_degrade_; // 是否降级
  13. };
  14. /// @brief 限流配额应答
  15. class QuotaResponse {
  16. public:
  17. /// @brief 获取限流配额结果
  18. QuotaResultCode GetResultCode() const;
  19. /// @brief 获取配额分配信息
  20. const QuotaResultInfo& GetQuotaResultInfo() const;
  21. /// @brief 请求需要获取多长时间才能使用配额
  22. uint64_t GetWaitTime() const;
  23. };

如何基于 polaris-cpp 客户端完成一个服务限流的程序