介绍

Logo

summer-rs是Rust编写的应用框架,类似于java生态的SpringBoot

English | 中文

crates.io Documentation Documentation

summer-rs是一个Rust编写的应用框架,强调约定大于配置,类似于java生态的SpringBoot。summer-rs提供了易于扩展的插件系统,用于整合Rust社区的优秀项目,例如axum、sqlx、sea-orm等。

相比于java生态的SpringBoot,summer-rs有更高的性能和更低的内存占用,让你彻底摆脱臃肿的JVM,轻装上阵。

特点

  • ⚡️ 高性能: 得益于出色的Rust语言,summer-rs拥有与c/c++媲美的极致性能
  • 🛡️ 高安全性: 相比C/C++,summer-rs使用的Rust语言提供了内存安全和线程安全的能力
  • 🔨 轻量级: summer-rs的核心代码不超过5000行,打包的release版二进制文件也非常小巧
  • 🔧 容易使用: summer-rs提供了清晰明了的API和可选的过程宏来简化开发
  • 🔌 高可扩展性: summer-rs采用高扩展性的插件模式,用户可以自定义插件扩展程序功能
  • ⚙️ 高可配置性: summer-rs用toml配置应用和插件,提升应用灵活性

简单的例子

web

use summer::{auto_config, App};
use summer_sqlx::{
    sqlx::{self, Row},
    ConnectPool, SqlxPlugin
};
use summer_web::{get, route};
use summer_web::{
    error::Result, extractor::{Path, Component}, handler::TypeRouter, axum::response::IntoResponse, Router, 
    WebConfigurator, WebPlugin,
};

#[auto_config(WebConfigurator)]
#[tokio::main]
async fn main() {
    App::new()
        .add_plugin(SqlxPlugin)
        .add_plugin(WebPlugin)
        .run()
        .await
}

#[get("/")]
async fn hello_world() -> impl IntoResponse {
    "hello world"
}

#[route("/hello/{name}", method = "GET", method = "POST")]
async fn hello(Path(name): Path<String>) -> impl IntoResponse {
    format!("hello {name}")
}

#[get("/version")]
async fn sqlx_request_handler(Component(pool): Component<ConnectPool>) -> Result<String> {
    let version = sqlx::query("select version() as version")
        .fetch_one(&pool)
        .await
        .context("sqlx query failed")?
        .get("version");
    Ok(version)
}

任务调度

use anyhow::Context;
use summer::{auto_config, App};
use summer_job::{cron, fix_delay, fix_rate};
use summer_job::{extractor::Component, JobConfigurator, JobPlugin};
use summer_sqlx::{
    sqlx::{self, Row},
    ConnectPool, SqlxPlugin,
};
use std::time::{Duration, SystemTime};

#[auto_config(JobConfigurator)]
#[tokio::main]
async fn main() {
    App::new()
        .add_plugin(JobPlugin)
        .add_plugin(SqlxPlugin)
        .run()
        .await;

    tokio::time::sleep(Duration::from_secs(100)).await;
}

#[cron("1/10 * * * * *")]
async fn cron_job(Component(db): Component<ConnectPool>) {
    let time: String = sqlx::query("select TO_CHAR(now(),'YYYY-MM-DD HH24:MI:SS') as time")
        .fetch_one(&db)
        .await
        .context("query failed")
        .unwrap()
        .get("time");
    println!("cron scheduled: {:?}", time)
}

#[fix_delay(5)]
async fn fix_delay_job() {
    let now = SystemTime::now();
    let datetime: sqlx::types::chrono::DateTime<sqlx::types::chrono::Local> = now.into();
    let formatted_time = datetime.format("%Y-%m-%d %H:%M:%S");
    println!("fix delay scheduled: {}", formatted_time)
}

#[fix_rate(5)]
async fn fix_rate_job() {
    tokio::time::sleep(Duration::from_secs(10)).await;
    let now = SystemTime::now();
    let datetime: sqlx::types::chrono::DateTime<sqlx::types::chrono::Local> = now.into();
    let formatted_time = datetime.format("%Y-%m-%d %H:%M:%S");
    println!("fix rate scheduled: {}", formatted_time)
}

component宏

Cargo.toml 中添加依赖:

[dependencies]
summer = "0.4"
tokio = { version = "1", features = ["full"] }

使用 #[component] 宏简化组件注册:

use summer::component;
use summer::config::Configurable;
use summer::extractor::Config;
use summer::plugin::ComponentRegistry;
use summer::App;
use serde::Deserialize;

// 定义配置
#[derive(Clone, Configurable, Deserialize)]
#[config_prefix = "app"]
struct AppConfig {
    name: String,
}

// 定义组件
#[derive(Clone)]
struct AppService {
    config: AppConfig,
}

// 使用 #[component] 宏自动注册
#[component]
fn app_service(Config(config): Config<AppConfig>) -> AppService {
    AppService { config }
}

#[tokio::main]
async fn main() {
    // 组件会自动注册
    let app = App::new().build().await.unwrap();
    
    // 获取已注册的组件
    let service = app.get_component::<AppService>().unwrap();
    println!("应用名称: {}", service.config.name);
}

#[component] 宏消除了样板代码 - 无需手动实现 Plugin trait!了解更多 →

支持的插件

插件Crate集成组件说明
summer-websummer-webaxumWeb 框架,基于 axum
summer-sqlxsummer-sqlxsqlx异步 SQL 访问
summer-postgressummer-postgresrust-postgresPostgreSQL 客户端集成
summer-sea-ormsummer-sea-ormsea-ormORM 支持
summer-redissummer-redisredisRedis 集成
summer-mailsummer-maillettre邮件发送
summer-jobsummer-jobtokio-cron-scheduler定时任务 / Cron
summer-streamsummer-streamsea-streamer消息流处理(Redis Stream / Kafka)
summer-opentelemetrysummer-opentelemetryopentelemetry日志 / 指标 / 链路追踪
summer-grpcsummer-grpctonicgRPC 服务与调用
summer-opendalsummer-opendalopendal统一对象存储 / 数据访问
summer-apalissummer-apalisapalis高性能后台任务处理框架
summer-sa-tokensummer-sa-tokensa-token-rustSa-Token 权限认证框架

生态

更多>>

star history

项目示例

请作者喝杯茶

微信支付宝

交流群

QQ交流群微信交流群

贡献

也欢迎社区的大牛贡献自己的插件。 Contributing →

帮助

点击这里可以查看summer-rs使用过程中遇到的常见问题 Help →