| Crates.io | rseata-db-proxy |
| lib.rs | rseata-db-proxy |
| version | 0.1.2 |
| created_at | 2025-11-09 08:18:21.751206+00 |
| updated_at | 2025-11-11 05:59:03.124155+00 |
| description | rust seata |
| homepage | https://github.com/oulover/rseata |
| repository | |
| max_upload_size | |
| id | 1923803 |
| size | 176,662 |
RSeata - Rust实现的分布式事务框架
简介
RSeata是一个基于Rust语言的分布式事务解决方案,旨在以高性能和简单易用的方式处理微服务架构下的分布式事务问题。该项目灵感来自于Seata,支持AT模式。
项目结构
快速开始
前提条件
运行示例
克隆项目
git clone https://github.com/your-username/rseata.git
cd rseata
设置数据库
创建两个数据库:order和user
运行
cd rseata-tc cargo runcd examples/user-service
cargo runcd examples/order-service
cargo run测试分布式事务
通过order-service的API创建订单,order-service会调用user-service添加用户,这两个操作会在一个全局事务中。
添加依赖 在您的Cargo.toml中添加:
[dependencies]
rseata = { version = "0", features = ["full"] }
配置
初始化
rseata::init().await;
定义数据库实体(使用SeaORM)
use rseata::global_transaction;
#[global_transaction("your_transaction_name")]
pub async fn your_transaction_function(...) -> Result<()> {
// 你的代码
}
使用数据库代理
#[tokio::main]
async fn main() -> anyhow::Result<()> {
dotenv::dotenv().ok();
rseata::init().await;
let connect_url = dotenv::var("ORDER_DATABASE_URL")
.unwrap_or("mysql://root:root@127.0.0.1:3306/order".to_string());
let conn = rseata::db_proxy::sea_orm::ConnectionProxy::connect(&connect_url).await?;
Ok(())
}
在gRPC服务中,使用提供的拦截器(SeataMiddlewareLayer)来传播事务上下文。
pub(crate) async fn start_grpc_server(ctx: Arc<AppContext>) -> anyhow::Result<()> {
let addr = std::env::var("GRPC_BIND")
.unwrap_or_else(|_| "0.0.0.0:9001".into())
.parse()?;
tracing::info!("Server started on 0.0.0.0:9001");
Server::builder()
.layer(SeataMiddlewareLayer) // 在gRPC服务中,使用提供的拦截器(SeataMiddlewareLayer)来传播事务上下文。
.add_service(UserServiceServer::new(UserGrpcService { app_ctx: ctx }))
.serve(addr)
.await?;
Ok(())
}
感谢 Seata 项目提供的设计灵感
感谢 Tonic 提供的 gRPC 框架
感谢 SeaORM 提供的 ORM 支持