Rust网络测试工具toxiproxy_rust的使用:模拟网络延迟、故障和混沌测试的代理库
Rust网络测试工具toxiproxy_rust的使用:模拟网络延迟、故障和混沌测试的代理库
Toxiproxy - Rust客户端
Rust客户端用于Toxiproxy。
使用
填充代理:
let proxies = TOXIPROXY.populate(vec![
Proxy::new(
"socket_service".into(),
"localhost:2001".into(),
"localhost:2000".into(),
),
Proxy::new(
"redis".into(),
"localhost:6000".into(),
"localhost:6379".into(),
)
])?;
测试不可用的连接:
TOXIPROXY.find_and_reset_proxy("redis")?.with_down(|| {
// 调用所需的服务...
})?;
测试有毒代理:
TOXIPROXY.find_and_reset_proxy("redis")?.with_latency("downstream".into(), 2000, 0, 1.0).apply(|| {
// 调用所需的服务...
})?;
或者不使用安全的lambda(负责重置代理):
TOXIPROXY.find_proxy("redis")?.with_latency("downstream".into(), 2000, 0, 1.0)
// 调用所需的服务...
TOXIPROXY.find_proxy("redis")?.disable();
// 测试不可用性
TOXIPROXY.find_proxy("redis")?.enable();
支持的有毒代理:
- 延迟
- 下线
- 带宽
- 慢关闭
- 超时
- 切片器
- 数据限制
使用自定义的Toxiproxy服务器地址:
let toxiclient: Client = toxiproxy_rust::Client::new("1.2.3.4:5678");
开发
测试:
$> cargo test -- --test-threads 1
完整示例代码
use toxiproxy_rust::Client;
use toxiproxy_rust::proxy::Proxy;
use redis::Commands;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建客户端连接
let toxiclient: Client = toxiproxy_rust::Client::new("http://localhost:8474");
// 创建代理配置
let proxies = toxiclient.populate(vec![
Proxy::new(
"redis_proxy".into(),
"localhost:6000".into(),
"localhost:6379".into(),
)
]).await?;
// 测试延迟场景
toxiclient.find_and_reset_proxy("redis_proxy")?
.with_latency("downstream".into(), 2000, 0, 1.0)
.apply(|| {
// 连接Redis并测试延迟
let client = redis::Client::open("redis://localhost:6000")?;
let mut con = client.get_connection()?;
let start = std::time::Instant::now();
let _: () = con.set("test_key", "test_value")?;
println!("操作耗时: {:?}", start.elapsed());
Ok(())
})?;
// 测试连接断开场景
toxiclient.find_and_reset_proxy("redis_proxy")?
.with_down(|| {
// 测试Redis连接失败的情况
match redis::Client::open("redis://localhost:6000") {
Ok(client) => {
if let Err(e) = client.get_connection() {
println!("连接失败,符合预期: {}", e);
}
},
Err(e) => println!("客户端创建失败: {}", e)
}
Ok(())
})?;
// 测试带宽限制
toxiclient.find_and_reset_proxy("redis_proxy")?
.with_bandwidth("downstream".into(), 100) // 100KB/s
.apply(|| {
// 测试数据传输速度
let client = redis::Client::open("redis://localhost:6000")?;
let mut con = client.get_connection()?;
// 测试大数据传输
let large_data = vec![0u8; 1024 * 1024]; // 1MB数据
let start = std::time::Instant::now();
let _: () = con.set("large_data", large_data)?;
println!("1MB数据传输耗时: {:?}", start.elapsed());
Ok(())
})?;
Ok(())
}
安装
在项目目录中运行以下Cargo命令:
cargo add toxiproxy_rust
或者在Cargo.toml中添加以下行:
toxiproxy_rust = "0.1.6"
1 回复