Rust功能开关库configcat-openfeature-provider的使用:实现OpenFeature标准与ConfigCat的无缝集成

Rust功能开关库configcat-openfeature-provider的使用:实现OpenFeature标准与ConfigCat的无缝集成

安装

在项目目录中运行以下Cargo命令:

cargo add configcat-openfeature-provider

或者在您的Cargo.toml中添加以下内容:

[dependencies]
configcat-openfeature-provider = "0.1"

使用方式

ConfigCatProvider需要一个预先配置好的ConfigCat Rust SDK客户端:

use std::time::Duration;
use configcat::{Client, PollingMode};
use open_feature::OpenFeature;
use configcat_openfeature_provider::ConfigCatProvider;

#[tokio::main]
async fn main() {
    // 获取OpenFeature API实例
    let mut api = OpenFeature::singleton_mut().await;

    // 配置ConfigCat SDK
    let configcat_client = Client::builder("<YOUR-CONFIGCAT-SDK-KEY>")
        .polling_mode(PollingMode::AutoPoll(Duration::from_secs(60)))
        .build()
        .unwrap();

    // 配置provider
    api.set_provider(ConfigCatProvider::new(configcat_client)).await;

    // 创建客户端
    let client = api.create_client();

    // 评估功能开关
    let is_awesome_feature_enabled = client
        .get_bool_value("isAwesomeFeatureEnabled", None, None)
        .await
        .unwrap_or(false);
}

完整示例

以下是一个更完整的示例,展示了如何在实际应用中使用configcat-openfeature-provider:

use std::time::Duration;
use configcat::{Client, PollingMode};
use open_feature::OpenFeature;
use configcat_openfeature_provider::ConfigCatProvider;

#[tokio::main]
async fn main() {
    // 初始化OpenFeature API
    let mut api = OpenFeature::singleton_mut().await;

    // 配置ConfigCat客户端 - 使用自动轮询模式,每60秒更新一次配置
    let configcat_client = Client::builder("YOUR_SDK_KEY")
        .polling_mode(PollingMode::AutoPoll(Duration::from_secs(60)))
        .build()
        .expect("Failed to create ConfigCat client");

    // 设置OpenFeature provider
    api.set_provider(ConfigCatProvider::new(configcat_client))
        .await;

    // 创建功能开关客户端
    let client = api.create_client();

    // 评估布尔型功能开关
    match client.get_bool_value("new_user_interface", None, None).await {
        Ok(true) => println!("新用户界面已启用"),
        Ok(false) => println!("新用户界面未启用"),
        Err(e) => eprintln!("评估功能开关时出错: {:?}", e),
    }

    // 评估字符串型功能开关
    match client.get_string_value("welcome_message", None, None).await {
        Ok(msg) => println!("欢迎消息: {}", msg),
        Err(e) => eprintln!("获取欢迎消息时出错: {:?}", e),
    }

    // 评估数值型功能开关
    match client.get_int_value("max_items_per_page", None, None).await {
        Ok(count) => println!("每页最大项目数: {}", count),
        Err(e) => eprintln!("获取最大项目数时出错: {:?}", e),
    }
}

示例应用

这个仓库包含一个简单的示例应用,您可以使用以下命令运行:

cargo run --example print_eval

关于ConfigCat

ConfigCat是一个功能开关和配置管理服务,允许您将发布与部署分离。您可以在部署后使用ConfigCat仪表板开启/关闭功能。ConfigCat允许您根据地区、电子邮件或任何其他自定义用户属性定位特定用户组。

ConfigCat是一个托管的功能开关服务。管理前端、后端、移动和桌面应用程序中的功能开关。

完整示例代码

以下是一个更完整的示例,展示了如何在实际应用中使用configcat-openfeature-provider:

use std::time::Duration;
use configcat::{Client, PollingMode};
use open_feature::OpenFeature;
use configcat_openfeature_provider::ConfigCatProvider;

#[tokio::main]
async fn main() {
    // 1. 初始化OpenFeature API
    println!("初始化OpenFeature API...");
    let mut api = OpenFeature::singleton_mut().await;

    // 2. 配置ConfigCat客户端
    println!("配置ConfigCat客户端...");
    let configcat_client = Client::builder("YOUR_SDK_KEY")
        .polling_mode(PollingMode::AutoPoll(Duration::from_secs(60))) // 自动轮询模式,60秒更新一次
        .build()
        .expect("创建ConfigCat客户端失败");

    // 3. 设置OpenFeature provider
    println!("设置OpenFeature provider...");
    api.set_provider(ConfigCatProvider::new(configcat_client))
        .await;

    // 4. 创建功能开关客户端
    println!("创建功能开关客户端...");
    let client = api.create_client();

    // 5. 评估各种类型的开关
    println!("开始评估功能开关...");
    
    // 5.1 布尔型开关
    println!("\n评估布尔型开关:");
    evaluate_bool(&client, "new_user_interface").await;
    evaluate_bool(&client, "dark_mode_enabled").await;
    
    // 5.2 字符串型开关
    println!("\n评估字符串型开关:");
    evaluate_string(&client, "welcome_message").await;
    evaluate_string(&client, "special_offer_text").await;
    
    // 5.3 数值型开关
    println!("\n评估数值型开关:");
    evaluate_int(&client, "max_items_per_page").await;
    evaluate_int(&client, "discount_percentage").await;
    
    // 5.4 带默认值的评估
    println!("\n带默认值的评估:");
    let unknown_value = client.get_string_value("unknown_feature", Some("默认值"), None)
        .await
        .unwrap_or("回退值".to_string());
    println!("未知功能开关值: {}", unknown_value);
}

async fn evaluate_bool(client: &open_feature::Client, key: &str) {
    match client.get_bool_value(key, None, None).await {
        Ok(true) => println!("{}: 已启用", key),
        Ok(false) => println!("{}: 未启用", key),
        Err(e) => eprintln!("评估{}时出错: {:?}", key, e),
    }
}

async fn evaluate_string(client: &open_feature::Client, key: &str) {
    match client.get_string_value(key, None, None).await {
        Ok(value) => println!("{}: {}", key, value),
        Err(e) => eprintln!("获取{}时出错: {:?}", key, e),
    }
}

async fn evaluate_int(client: &open_feature::Client, key: &str) {
    match client.get_int_value(key, None, None).await {
        Ok(value) => println!("{}: {}", key, value),
        Err(e) => eprintln!("获取{}时出错: {:?}", key, e),
    }
}

这个完整示例展示了:

  1. 初始化OpenFeature API
  2. 配置ConfigCat客户端
  3. 设置OpenFeature provider
  4. 创建功能开关客户端
  5. 评估各种类型的开关(布尔型、字符串型、数值型)
  6. 带默认值的评估
  7. 将评估逻辑封装为可重用函数

您可以根据实际需求修改和扩展这个示例。


1 回复

Rust功能开关库configcat-openfeature-provider使用指南

介绍

configcat-openfeature-provider是一个Rust库,它实现了OpenFeature标准与ConfigCat功能标记服务的无缝集成。这个库允许开发者在Rust应用中轻松使用ConfigCat作为功能开关管理后端,同时遵循OpenFeature的标准API。

OpenFeature是一个开源标准,为功能标记(Feature Flags)提供统一的API,而ConfigCat是一个流行的功能标记管理服务。通过这个库,你可以获得两方面的优势:

  • 使用OpenFeature的标准接口
  • 利用ConfigCat的强大功能管理后台

安装

在Cargo.toml中添加依赖:

[dependencies]
configcat-openfeature-provider = "0.1"
openfeature = "0.4"

基本使用方法

1. 创建Provider并设置客户端

use configcat_openfeature_provider::ConfigCatProvider;
use openfeature::api::{Client, EvaluationContext};
use openfeature::provider::Provider;

fn main() {
    // 使用你的ConfigCat SDK Key初始化provider
    let provider = ConfigCatProvider::new("YOUR_SDK_KEY");
    
    // 设置全局provider
    openfeature::api::set_provider(provider);
    
    // 获取客户端
    let client = openfeature::api::get_client();
}

2. 使用功能开关

// 检查布尔型功能开关
let show_feature = client.get_boolean_value("new_feature_enabled", false, &EvaluationContext::default());
println!("New feature enabled: {}", show_feature);

// 获取字符串型配置
let welcome_message = client.get_string_value("welcome_message", "Welcome back!", &EvaluationContext::default());
println!("Message: {}", welcome_message);

// 获取数值型配置
let discount_rate = client.get_float_value("special_discount", 0.0, &EvaluationContext::default());
println!("Discount rate: {}%", discount_rate * 100.0);

高级用法

用户上下文

use openfeature::api::{EvaluationContextBuilder, Value};

let context = EvaluationContextBuilder::new()
    .targeting_key("user123")
    .set_value("email", Value::String("user@example.com".into()))
    .set_value("subscription", Value::String("premium".into()))
    .build();

let is_premium_feature = client.get_boolean_value(
    "premium_feature", 
    false, 
    &context
);

自定义配置

use configcat_openfeature_provider::ConfigCatProviderBuilder;
use std::time::Duration;

let provider = ConfigCatProviderBuilder::new("YOUR_SDK_KEY")
    .polling_interval(Duration::from_secs(60)) // 设置轮询间隔
    .data_governance(DataGovernance::Global)  // 设置数据治理策略
    .build();

错误处理

match client.get_boolean_details("feature_key", false, &EvaluationContext::default()) {
    Ok(details) => println!("Value: {}, Reason: {:?}", details.value, details.reason),
    Err(err) => eprintln!("Error evaluating flag: {}", err),
}

完整示例代码

use configcat_openfeature_provider::{ConfigCatProvider, ConfigCatProviderBuilder, DataGovernance};
use openfeature::api::{Client, EvaluationContext, EvaluationContextBuilder, Value};
use std::time::Duration;

fn main() {
    // 1. 初始化Provider
    let provider = ConfigCatProviderBuilder::new("YOUR_SDK_KEY")
        .polling_interval(Duration::from_secs(60)) // 每60秒轮询一次配置更新
        .data_governance(DataGovernance::Global)  // 使用全局数据治理策略
        .build();
    
    // 2. 设置全局Provider
    openfeature::api::set_provider(provider);
    
    // 3. 获取客户端
    let client = openfeature::api::get_client();
    
    // 4. 基本功能开关使用
    let show_feature = client.get_boolean_value("new_feature_enabled", false, &EvaluationContext::default());
    println!("New feature enabled: {}", show_feature);
    
    // 5. 高级用法 - 带用户上下文的评估
    let user_context = EvaluationContextBuilder::new()
        .targeting_key("user123")
        .set_value("email", Value::String("user@example.com".into()))
        .set_value("subscription", Value::String("premium".into()))
        .build();
        
    let is_premium_feature = client.get_boolean_value(
        "premium_feature", 
        false, 
        &user_context
    );
    println!("Premium feature enabled for user: {}", is_premium_feature);
    
    // 6. 错误处理
    match client.get_boolean_details("non_existent_feature", false, &EvaluationContext::default()) {
        Ok(details) => println!("Value: {}, Reason: {:?}", details.value, details.reason),
        Err(err) => eprintln!("Error evaluating flag: {}", err),
    }
}

最佳实践

  1. 初始化一次:在应用启动时初始化Provider并保持单例
  2. 合理设置轮询间隔:根据应用需求平衡实时性和性能
  3. 使用上下文:充分利用用户上下文实现定向发布
  4. 设置默认值:总是为功能标记提供合理的默认值
  5. 错误处理:适当处理功能标记评估可能出现的错误

这个库为Rust开发者提供了符合OpenFeature标准的ConfigCat集成方案,使得功能开关管理更加标准化和便捷。

回到顶部