负载均衡

引入依赖

参考文档:依赖引入

初始化 polaris.yaml

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

SDK实例构建

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

  1. #include "polaris/consumer.h"
  2. int main(int argc, char** argv) {
  3. consumer_ = std::unique_ptr<polaris::ConsumerApi>(polaris::ConsumerApi::CreateWithDefaultFile());
  4. }

服务路由

GetInstances

每次获取一批可用服务提供者实例,该方法会执行路由流程。

该方法默认会过滤掉不健康、隔离、权重为0、被熔断的实例。

说明:

执行路由流程的条件

  • 配置了 GetInstancesRequest.SourceService.Metadata 属性,会触发自定义路由流程
  • 设置了 GetInstancesRequest.Metadata 属性,会触发元数据路由流程
  1. /// @brief 获取单个服务实例请求
  2. class GetOneInstanceRequest : Noncopyable {
  3. public:
  4. /// @brief 构建获取单个服务实例请求对象
  5. /// @param service_key 命名空间和服务名
  6. explicit GetOneInstanceRequest(const ServiceKey& service_key);
  7. /// @brief 设置hash key,用于一致性哈希负载均衡算法选择服务实例。其他负载均衡算法不用设置
  8. void SetHashKey(uint64_t hash_key);
  9. /// @brief 设置 hash 字符串, sdk 会用 hash_string 算出一个 uint64_t
  10. /// 的哈希值用于一致性哈希负载均衡算法选择服务实例。其他负载均衡算法不用设置
  11. void SetHashString(const std::string& hash_string);
  12. /// @brief 设置负载均衡类型。可选,默认使用配置文件中设置的类型
  13. /// LoadBalanceType可取值如下:
  14. /// - kLoadBalanceTypeWeightedRandom // 权重随机
  15. /// - kLoadBalanceTypeRingHash // 一致性hash负载均衡
  16. /// - kLoadBalanceTypeMaglevHash // 一致性Hash: maglev算法
  17. /// - kLoadBalanceTypeL5CstHash // 兼容L5的一致性Hash
  18. /// - kLoadBalanceTypeSimpleHash // hash_key%总实例数 选择服务实例
  19. /// - kLoadBalanceTypeDefaultConfig // 使用全局配置的负载均衡算法,默认值
  20. void SetLoadBalanceType(LoadBalanceType load_balance_type);
  21. /// @brief 设置用于重试的实例数。可选,默认不返回用于重试的实例
  22. /// @note 第一个实例由负载均衡器给出,外加backup_instance_num个实例,实例不重复,但不保证数量
  23. /// 内部的一致性环hash负载均衡返回实例后方相邻的实例,其他返回随机实例
  24. /// 从GetOneInstance的InstancesResponse获取实例
  25. /// @param backup_instance_num 重试(备份)实例数
  26. void SetBackupInstanceNum(uint32_t backup_instance_num);
  27. /// @param replicate_index 副本索引,默认为0表示当前hash实例本身
  28. /// 大于0表示从hash实例后面的第几个副本
  29. void SetReplicateIndex(int replicate_index);
  30. };
  31. // 调用该方法执行请求
  32. consumer->GetOneInstance(request, instance)

如何基于 polaris-cpp 客户端完成一个负载均衡的程序