Skip to content

spring-rs/spring-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Logo

spring-rs is application framework written in Rust, inspired by Java's SpringBoot

English | 中文

crates.io Documentation Documentation

spring-rs is an application framework that emphasizes convention over configuration, inspired by Java's SpringBoot. spring-rs provides an easily extensible plug-in system for integrating excellent projects in the Rust community, such as axum, sqlx, sea-orm, etc.

Compared with SpringBoot in java, spring-rs has higher performance and lower memory usage, allowing you to completely get rid of the bloated JVM and travel light.

Features

  • ⚡️ High performance: Benefiting from the awesome rust language, spring-rs has the ultimate performance comparable to C/C++
  • 🛡️ High security: Compared to C/C++, the Rust language used by spring-rs provides memory safety and thread safety.
  • 🔨 Lightweight: The core code of spring-rs does not exceed 5,000 lines, and the binary size of the release version packaged in rust is also small.
  • 🔧 Easy to use: spring-rs provides a clear and concise API and optional Procedural Macros to simplify development.
  • 🔌 Highly extensible: spring-rs uses a highly extensible plug-in model, and users can customize plug-ins to extend program capabilities.
  • ⚙️ Highly configurable: spring-rs uses toml to configure applications and plug-ins to improve application flexibility.

Example

web

use spring::{auto_config, App}; use spring_sqlx::{ sqlx::{self, Row}, ConnectPool, SqlxPlugin }; use spring_web::{get, route}; use spring_web::{ error::Result, extractor::{Path, Component}, handler::TypeRouter, axum::response::IntoResponse, Router, WebConfigurator, WebPlugin, }; use anyhow::Context; #[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) }

job

use anyhow::Context; use spring::{auto_config, App}; use spring_job::{cron, fix_delay, fix_rate}; use spring_job::{extractor::Component, JobConfigurator, JobPlugin}; use spring_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) }

Supported plugins

Ecosystem

more>>

Project showcase

Contribution

We also welcome community experts to contribute their own plugins. Contributing →

Help

Click here to view common problems encountered when using spring-rs Help →