动态路由

引入依赖

参考文档:依赖引入

初始化 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 GetInstancesRequest : Noncopyable {
  3. public:
  4. /// @brief 构造获取批量服务实例请求
  5. /// @param service_key 命名空间和服务名
  6. explicit GetInstancesRequest(const ServiceKey& service_key);
  7. /// @brief 设置服务路由时否包含不健康的服务实例。可选,默认不包含
  8. /// @note 即使设置不包含的情况下仍然可能降级返回不健康实例
  9. void SetIncludeUnhealthyInstances(bool include_unhealthy_instances);
  10. /// @brief 设置服务路由时是否包含熔断的服务实例。可选,默认不包含。
  11. /// @note 即使设置不包含的情况下仍然可能降级返回熔断实例
  12. void SetIncludeCircuitBreakInstances(bool include_circuit_breaker_instances);
  13. /// @brief 设置是否跳过服务路由。可选,默认不跳过服务路由
  14. void SetSkipRouteFilter(bool skip_route_filter);
  15. /// @brief 设置源服务信息,用于服务路由计算。可选
  16. void SetSourceService(const ServiceInfo& source_service);
  17. /// @brief 设置元数据,用于元数据路由
  18. void SetMetadata(std::map<std::string, std::string>& metadata);
  19. /// @brief 设置元数据路由匹配失败时的降级策略,默认不降级
  20. void SetMetadataFailover(MetadataFailoverType metadata_failover_type);
  21. };
  22. // 调用该方法执行请求
  23. consumer->GetInstances(request, instance)

说明:

如果当前 GetInstancesRequest 还不支持 AddArgument 方法,同时服务端版本 >= 1.12.0,SourceService.Metadata 对应的 key 名称如下:

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

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