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),
}
}
这个完整示例展示了:
- 初始化OpenFeature API
- 配置ConfigCat客户端
- 设置OpenFeature provider
- 创建功能开关客户端
- 评估各种类型的开关(布尔型、字符串型、数值型)
- 带默认值的评估
- 将评估逻辑封装为可重用函数
您可以根据实际需求修改和扩展这个示例。
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),
}
}
最佳实践
- 初始化一次:在应用启动时初始化Provider并保持单例
- 合理设置轮询间隔:根据应用需求平衡实时性和性能
- 使用上下文:充分利用用户上下文实现定向发布
- 设置默认值:总是为功能标记提供合理的默认值
- 错误处理:适当处理功能标记评估可能出现的错误
这个库为Rust开发者提供了符合OpenFeature标准的ConfigCat集成方案,使得功能开关管理更加标准化和便捷。