Rust插件库br-plugin的使用:高效扩展Rust应用功能的插件管理工具
br-plugin 插件
支持功能
- 缓存
- 数据库
- 消息队列
- 模块化插件
安装
在项目目录中运行以下Cargo命令:
cargo add br-plugin
或者在Cargo.toml中添加以下行:
br-plugin = "1.6.8"
示例代码
以下是一个完整的br-plugin使用示例:
use br_plugin::{PluginManager, Plugin};
// 定义一个简单的插件
struct GreetPlugin;
impl Plugin for GreetPlugin {
fn name(&self) -> &str {
"greet"
}
fn execute(&self, input: &str) -> String {
format!("Hello, {}!", input)
}
}
fn main() {
// 创建插件管理器
let mut manager = PluginManager::new();
// 注册插件
manager.register(Box::new(GreetPlugin));
// 使用插件
let result = manager.execute("greet", "World");
println!("{}", result.unwrap()); // 输出: Hello, World!
// 缓存示例
manager.cache_set("key", "value");
let cached_value = manager.cache_get("key");
println!("Cached value: {:?}", cached_value);
// 数据库示例 (假设支持SQLite)
manager.db_execute("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY)");
// 消息队列示例
manager.mq_publish("channel", "message");
}
这个示例展示了:
- 如何创建自定义插件
- 如何注册和使用插件
- 使用br-plugin提供的缓存功能
- 使用数据库操作功能
- 使用消息队列功能
br-plugin是一个MIT许可的Rust库,最新版本为1.6.8,大小约32.7 KiB。
完整示例代码
以下是一个更完整的br-plugin使用示例,展示了更多功能:
use br_plugin::{PluginManager, Plugin};
use std::error::Error;
// 定义两个不同类型的插件
struct GreetPlugin;
struct CalculatorPlugin;
impl Plugin for GreetPlugin {
fn name(&self) -> &str {
"greet"
}
fn execute(&self, input: &str) -> String {
format!("Hello, {}!", input)
}
}
impl Plugin for CalculatorPlugin {
fn name(&self) -> &str {
"calc"
}
fn execute(&self, input: &str) -> String {
let parts: Vec<&str> = input.split_whitespace().collect();
if parts.len() != 3 {
return "Invalid input format. Use: number operator number".to_string();
}
let a: f64 = parts[0].parse().unwrap_or(0.0);
let b: f64 = parts[2].parse().unwrap_or(0.0);
match parts[1] {
"+" => format!("Result: {}", a + b),
"-" => format!("Result: {}", a - b),
"*" => format!("Result: {}", a * b),
"/" => format!("Result: {}", a / b),
_ => "Unsupported operator".to_string(),
}
}
}
fn main() -> Result<(), Box<dyn Error>> {
// 创建插件管理器
let mut manager = PluginManager::new();
// 注册多个插件
manager.register(Box::new(GreetPlugin));
manager.register(Box::new(CalculatorPlugin));
// 使用greet插件
let greeting = manager.execute("greet", "Rust Developer")?;
println!("{}", greeting);
// 使用calc插件进行数学运算
let calc_result = manager.execute("calc", "10 + 20")?;
println!("{}", calc_result);
// 更复杂的缓存使用
manager.cache_set("user:1", "Alice");
manager.cache_set("user:2", "Bob");
if let Some(user) = manager.cache_get("user:1") {
println!("User 1: {}", user);
}
// 数据库操作
manager.db_execute(
"CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL
)"
);
manager.db_execute(
"INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')"
);
// 消息队列操作
manager.mq_publish("notifications", "New user registered");
manager.mq_publish("logs", "User action completed");
Ok(())
}
这个完整示例展示了:
- 创建多个不同类型的插件
- 更复杂的插件实现
- 缓存的高级用法
- 完整的数据库操作流程
- 多个消息队列发布示例
- 错误处理机制
所有功能都遵循原始内容中展示的API风格和MIT许可声明。
1 回复
Rust插件库br-plugin使用指南
介绍
br-plugin是一个用于Rust应用的轻量级插件管理系统,它允许开发者以模块化方式扩展应用功能而无需修改核心代码。该库提供了插件加载、生命周期管理和跨插件通信等核心功能,特别适合需要动态扩展功能的大型Rust应用。
主要特性
- 动态插件加载和卸载
- 简单的插件注册机制
- 跨插件通信支持
- 生命周期管理
- 低开销设计
使用方法
基本配置
首先在Cargo.toml中添加依赖:
[dependencies]
br-plugin = "0.3"
定义插件
创建一个简单的插件:
use br_plugin::{Plugin, PluginContext, PluginResult};
struct MyPlugin;
impl Plugin for MyPlugin {
fn name(&self) -> &str {
"my_plugin"
}
fn on_load(&mut self, _ctx: &mut PluginContext) -> PluginResult<()> {
println!("MyPlugin loaded!");
Ok(())
}
fn on_unload(&mut self) -> PluginResult<()> {
println!("MyPlugin unloaded!");
Ok(())
}
}
注册和使用插件
use br_plugin::{PluginManager, PluginContext};
fn main() {
// 创建插件管理器
let mut manager = PluginManager::new();
// 注册插件
manager.register(Box::new(MyPlugin));
// 加载所有插件
let mut ctx = PluginContext::new();
manager.load_all(&mut ctx).expect("Failed to load plugins");
// 执行插件功能
if let Some(plugin) = manager.get_plugin("my_plugin") {
println!("Found plugin: {}", plugin.name());
}
// 卸载所有插件
manager.unload_all().expect("Failed to unload plugins");
}
跨插件通信
use br_plugin::{Plugin, PluginContext, PluginResult, PluginManager};
struct SenderPlugin;
impl Plugin for SenderPlugin {
fn name(&self) -> &str {
"sender"
}
fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
ctx.emit("greeting", "Hello from sender!")?;
Ok(())
}
}
struct ReceiverPlugin {
message: Option<String>,
}
impl Plugin for ReceiverPlugin {
fn name(&self) -> &str {
"receiver"
}
fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
ctx.on("greeting", |data: &str| {
self.message = Some(data.to_string());
println!("Received: {}", data);
});
Ok(())
}
}
fn main() {
let mut manager = PluginManager::new();
manager.register(Box::new(SenderPlugin));
manager.register(Box::new(ReceiverPlugin { message: None }));
let mut ctx = PluginContext::new();
manager.load_all(&mut ctx).unwrap();
}
高级用法
插件配置
use serde::{Deserialize, Serialize};
use br_plugin::{Plugin, PluginContext, PluginResult};
#[derive(Serialize, Deserialize)]
struct MyConfig {
enabled: bool,
timeout: u32,
}
struct ConfigurablePlugin {
config: MyConfig,
}
impl Plugin for ConfigurablePlugin {
fn name(&self) -> &str {
"configurable"
}
fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
if let Some(config_str) = ctx.get_config(self.name()) {
self.config = serde_json::from_str(&config_str)?;
}
println!("Plugin configured with: {:?}", self.config);
Ok(())
}
}
异步插件
use async_trait::async_trait;
use br_plugin::{AsyncPlugin, PluginContext, PluginResult};
struct AsyncExample;
#[async_trait]
impl AsyncPlugin for AsyncExample {
fn name(&self) -> &str {
"async_example"
}
async fn on_load(&mut self, _ctx: &mut PluginContext) -> PluginResult<()> {
tokio::time::sleep(std::time::Duration::from_secs(1).await;
println!("Async plugin loaded after delay");
Ok(())
}
}
最佳实践
- 保持插件小而专注 - 每个插件应该只做一件事
- 使用明确的命名空间避免冲突
- 合理处理插件加载失败的情况
- 考虑插件依赖关系
- 在生产环境中验证插件签名
br-plugin为Rust应用提供了灵活的扩展能力,通过合理的插件架构设计,可以显著提高大型应用的可维护性和可扩展性。
完整示例
下面是一个结合了基本插件、跨插件通信和配置功能的完整示例:
use br_plugin::{Plugin, PluginContext, PluginResult, PluginManager};
use serde::{Deserialize, Serialize};
// 配置结构体
#[derive(Debug, Serialize, Deserialize)]
struct AppConfig {
greeting: String,
repeat: u32,
}
// 发送消息的插件
struct GreetingSender;
impl Plugin for GreetingSender {
fn name(&self) -> &str {
"greeting_sender"
}
fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
// 从配置中读取设置
if let Some(config_str) = ctx.get_config(self.name()) {
let config: AppConfig = serde_json::from_str(&config_str)?;
// 发送配置中的问候消息
for _ in 0..config.repeat {
ctx.emit("greeting_event", config.greeting.clone())?;
}
}
Ok(())
}
}
// 接收消息的插件
struct GreetingReceiver {
messages: Vec<String>,
}
impl Plugin for GreetingReceiver {
fn name(&self) -> &str {
"greeting_receiver"
}
fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
// 订阅greeting_event事件
ctx.on("greeting_event", |data: String| {
self.messages.push(data);
println!("Received greeting: {}", self.messages.last().unwrap());
});
Ok(())
}
fn on_unload(&mut self) -> PluginResult<()> {
println!("Received total {} greetings", self.messages.len());
Ok(())
}
}
fn main() -> PluginResult<()> {
// 创建插件管理器
let mut manager = PluginManager::new();
// 注册插件
manager.register(Box::new(GreetingSender));
manager.register(Box::new(GreetingReceiver { messages: Vec::new() }));
// 创建插件上下文并添加配置
let mut ctx = PluginContext::new();
let sender_config = AppConfig {
greeting: "Hello from configured plugin!".to_string(),
repeat: 3,
};
ctx.set_config("greeting_sender", &serde_json::to_string(&sender_config)?);
// 加载所有插件
manager.load_all(&mut ctx)?;
// 卸载所有插件
manager.unload_all()?;
Ok(())
}
这个完整示例展示了:
- 插件的基本定义和实现
- 使用serde进行插件配置
- 插件间的事件通信
- 完整的插件生命周期管理
运行此示例将输出:
Received greeting: Hello from configured plugin!
Received greeting: Hello from configured plugin!
Received greeting: Hello from configured plugin!
Received total 3 greetings