#web-framework #grpc #web #grpc-api #http-api #health-check #axum

roadster

A "Batteries Included" web framework for rust designed to get you moving fast

36 个版本 (4 个重大更新)

0.5.19 2024 年 8 月 12 日
0.5.18 2024 年 8 月 6 日
0.5.13 2024 年 7 月 31 日
0.4.0 2024 年 7 月 1 日
0.1.1 2024 年 5 月 6 日

#34 in HTTP 服务器

Download history 220/week @ 2024-05-03 21/week @ 2024-05-10 1/week @ 2024-05-17 483/week @ 2024-05-24 526/week @ 2024-05-31 366/week @ 2024-06-07 251/week @ 2024-06-14 441/week @ 2024-06-21 817/week @ 2024-06-28 443/week @ 2024-07-05 61/week @ 2024-07-12 568/week @ 2024-07-19 636/week @ 2024-07-26 533/week @ 2024-08-02 207/week @ 2024-08-09 152/week @ 2024-08-16

1,678 每月下载量

MIT/Apache

395KB
10K SLoC

Roadster

crates.io docs.rs Crates.io MSRV Crates.io License GitHub Discussions codecov Checks Feature Powerset dependency status

Roadster 是一个 "包含电池" 的 Rust Web 框架,旨在快速启动你的项目 🏎️。灵感来自其他功能齐全的框架,如 RailsDjangoLaravelLocoPoem

特性

  • 基于 Tokio 的 Web 栈(axum、tower、hyper、tracing)。通过利用 tokio 生态系统的所有资源,可以轻松扩展应用程序的行为。
  • 内置对 HTTP API 的支持,通过 Axum(具有 http 功能)和 gRPC API 通过 Tonic(具有 grpc 功能)。
  • 自动为使用 aide(需要 open-api 功能)定义的 HTTP API 路由生成 OpenAPI 模式。
  • 支持运行任意长时间运行的服务(例如,不支持开箱即用的 API 格式),只需提供一个包含异步函数的 FunctionService 并在 App#services 方法中注册即可。
  • 提供合理的默认值,以便您可以专注于构建应用程序,但大多数(所有?)内置行为都可以通过环境配置文件进行自定义或禁用。
  • 使用 #![forbid(unsafe_code)] 确保Roadster 中的所有代码都是 100% 安全的 Rust。
  • 提供用于常见命令的 CLI,并允许消费者使用 clap(需要 cli 功能)提供自己的 CLI 命令。
  • 为Axum提供示例JWT提取器(需要jwt-ietf和/或jwt-openid功能)。同时提供Axum的通用JWT提取器,将所有声明简单放入映射中(通过jwt功能提供)
  • 内置对SeaORM的支持,包括创建数据库连接(需要db-sql功能)
  • 内置对Sidekiq.rs的支持,用于运行异步/后台作业(需要sidekiq功能)
  • 使用tokio的tracing crate进行结构化日志/跟踪。使用OpenTelemetry导出跟踪/指标(需要otel功能)。
  • 健康检查以确保应用程序的外部依赖项健康
  • 为常见的数据库表预构建迁移,例如user(需要db-sql功能)
  • 支持在更新数据库行时自动更新时间戳列,例如updated_at(目前仅限Postgres)(需要db-sql功能)

入门

启动本地数据库

# Replace `full_dev` with your app name, e.g., `myapp_dev` (unless you're using our `full` example, as demonstrated below)
# Dev
docker run -d -p 5432:5432 -e POSTGRES_USER=roadster -e POSTGRES_DB=full_dev -e POSTGRES_PASSWORD=roadster postgres:15.3-alpine
# Test
docker run -d -p 5433:5432 -e POSTGRES_USER=roadster -e POSTGRES_DB=full_test -e POSTGRES_PASSWORD=roadster postgres:15.3-alpine

启动本地Redis实例(用于Sidekiq.rs

# Dev
docker run -d -p 6379:6379 redis:7.2-alpine
# Test
docker run -d -p 6380:6379 redis:7.2-alpine

创建您的应用程序

# Todo: Add instructions for creating a new app
# Using one of our examples for now 
git clone https://github.com/roadster-rs/roadster.git
cd roadster/examples/full

设置环境(生产/开发/测试)

# Either set it as an environment variable
export ROADSTER__ENVIRONMENT=development
# Or add it to a `.env` file
echo ROADSTER__ENVIRONMENT=development >> .env

启动您的应用程序

cargo run

添加用户界面

目前,Roadster专注于使用Rust进行后端API开发。我们留给消费者决定他们如何添加前端,例如使用现有的JS/TS框架(如React / Next / Vue / Svelte / Solid 等)或使用Rust前端框架(如Leptos / Yew / Perseus / Sycamore 等)。尽管如此,我们有一些如何使用Roadster与这些框架一起使用的示例。

示例

框架 示例
Leptos leptos-ssr

跟踪 + OpenTelemetry

Roadster允许使用tracingopentelemetry_rust集成来报告跟踪和指标。提供您的OTLP导出器URL,以便将跟踪/指标数据报告给您的遥测提供商(例如,SigNoz、New Relic、Datadog等)。

本地查看跟踪

您还可以使用Jaeger或SigNoz等工具本地查看跟踪。

Jaeger

在本地查看OpenTelemetry跟踪的最简单方法是运行Jaeger

  1. 在您的.env文件中设置ROADSTER__TRACING__OTLP_ENDPOINT="https://127.0.0.1:4317",或者在适当的config/development.tomlconfig/test.toml配置中。
  2. 运行以下命令
    docker run --rm --name jaeger \
        -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
        -p 6831:6831/udp \
        -p 6832:6832/udp \
        -p 5778:5778 \
        -p 16686:16686 \
        -p 4317:4317 \
        -p 4318:4318 \
        -p 14250:14250 \
        -p 14268:14268 \
        -p 14269:14269 \
        -p 9411:9411 \
        jaegertracing/all-in-one:1.53
    
  3. 导航到UI,可在localhost:16686上找到。

Signoz

另一种查看本地跟踪(和指标)的选项是运行Signoz

  1. 在您的.env文件中设置ROADSTER__TRACING__OTLP_ENDPOINT="https://127.0.0.1:4317",或者在适当的config/development.tomlconfig/test.toml配置中。
  2. 在您选择的目录中安装并运行Signoz
    # Clone the repo
    git clone -b main https://github.com/SigNoz/signoz.git && cd signoz/deploy/
    # Remove the sample application: https://signoz.io/docs/operate/docker-standalone/#remove-the-sample-application-from-signoz-dashboard
    vim docker/clickhouse-setup/docker-compose.yaml
    # Remove the `services.hotrod` and `services.load-hotrod` sections, then exit `vim`
    # Run the `docker compose` command
    ./install.sh
    
  3. 导航到UI,可在localhost:3301上找到。
  4. 要停止Signoz,请运行以下
    docker compose -f docker/clickhouse-setup/docker-compose.yaml stop
    

背景/异步作业队列使用 Sidekiq.rs

这个包是 Sidekiq 的 Rust 实现,Sidekiq 通常与 Ruby on Rails 一起使用。要使用它,我们只需要一个 Redis 实例。

Sidekiq 控制台

我们提供了一个 示例仓库,可以在独立的 Docker 容器中本地运行 sidekiq 控制台。

git clone https://github.com/roadster-rs/standalone_sidekiq_dashboard.git
cd standalone_sidekiq_dashboard
docker build -t standalone-sidekiq .
# Linux docker commands
# Development
docker run -d --network=host standalone-sidekiq
# Test
docker run -d --network=host -e REDIS_URL='redis://127.0.0.1:6380' standalone-sidekiq

# Mac docker commands -- todo: see if there's a command that will work on both mac and linux
# Development
docker run -d -p 9292:9292 -e REDIS_URL=redis://host.docker.internal:6379 standalone-sidekiq
# Test
docker run -d -p 9292:9292 -e REDIS_URL=redis://host.docker.internal:6380 standalone-sidekiq

Redis Insights

您也可以使用 RedisInsight 直接检查 Redis 数据库。

# Linux docker commands
docker run -d --name redisinsight --network=host -p 5540:5540 redis/redisinsight:latest
# Mac docker commands -- todo: see if there's a command that will work on both mac and linux
# Use `host.docker.internal` as the host domain in redis insight (instead of `127.0.0.1`)
docker run -d --name redisinsight -p 5540:5540 redis/redisinsight:latest

依赖项

~16–36MB
~557K SLoC