动态路由
引入依赖
参考文档:依赖引入
初始化 polaris.yaml
你需要在项目的根路径下创建一个 polaris.yaml 文件用于初始化 polaris-cpp SDK。polaris.yaml配置详细
SDK实例构建
当初始化好 polaris.yaml 文件之后,你可以直接使用 include polaris/consumer.h, 使用polaris::ConsumerApi::CreateWithDefaultFile() 方法进行构造一个 ConsumerApi SDK 实例
#include "polaris/consumer.h"
int main(int argc, char** argv) {
consumer_ = std::unique_ptr<polaris::ConsumerApi>(polaris::ConsumerApi::CreateWithDefaultFile());
}
服务路由
GetInstances
每次获取一批可用服务提供者实例,该方法会执行路由流程。
该方法默认会过滤掉不健康、隔离、权重为0、被熔断的实例。
说明:
执行路由流程的条件
- 配置了 GetInstancesRequest.SourceService.Metadata 属性,会触发自定义路由流程
- 设置了 GetInstancesRequest.Metadata 属性,会触发元数据路由流程
/// @brief 获取批量服务实例请求
class GetInstancesRequest : Noncopyable {
public:
/// @brief 构造获取批量服务实例请求
/// @param service_key 命名空间和服务名
explicit GetInstancesRequest(const ServiceKey& service_key);
/// @brief 设置服务路由时否包含不健康的服务实例。可选,默认不包含
/// @note 即使设置不包含的情况下仍然可能降级返回不健康实例
void SetIncludeUnhealthyInstances(bool include_unhealthy_instances);
/// @brief 设置服务路由时是否包含熔断的服务实例。可选,默认不包含。
/// @note 即使设置不包含的情况下仍然可能降级返回熔断实例
void SetIncludeCircuitBreakInstances(bool include_circuit_breaker_instances);
/// @brief 设置是否跳过服务路由。可选,默认不跳过服务路由
void SetSkipRouteFilter(bool skip_route_filter);
/// @brief 设置源服务信息,用于服务路由计算。可选
void SetSourceService(const ServiceInfo& source_service);
/// @brief 设置元数据,用于元数据路由
void SetMetadata(std::map<std::string, std::string>& metadata);
/// @brief 设置元数据路由匹配失败时的降级策略,默认不降级
void SetMetadataFailover(MetadataFailoverType metadata_failover_type);
};
// 调用该方法执行请求
consumer->GetInstances(request, instance)
说明:
如果当前 GetInstancesRequest 还不支持 AddArgument 方法,同时服务端版本 >= 1.12.0,SourceService.Metadata 对应的 key 名称如下:
- 路径: $path
- 方法: $method
- 请求头: $header.{标签键}
- 请求参数: $query.{标签键}
- 请求COOKIE: $cookie.{标签键}
- 主调IP: $caller_ip
- 自定义: {标签键}