Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Быстрый старт
Самый быстрый путь к работающему сервису - сгенерировать заготовку через cargo generate.
Заготовка проекта
cargo install cargo-generate
cargo generate --git https://github.com/powersemmi/ruststream templates/memory --name my-service
cd my-service
Для генерации нужен только cargo generate. templates/memory - стартовый шаблон на in-memory
брокере. Шаблон из адаптации библиотеки брокера разворачивается так же: указывают репозиторий
адаптации и путь к шаблону (например,
--git https://github.com/powersemmi/ruststream-nats templates/nats); какие шаблоны есть у
адаптации, сказано в её собственной документации. cargo generate создаёт идиоматичный проект из
нескольких файлов:
my-service/
├── Cargo.toml
└── src/
├── main.rs # #[ruststream::app] строит сервис и монтирует роутер
├── orders.rs # обработчики как функции #[subscriber] (один публикует ответ)
└── routes.rs # собирает обработчики в Router
Запуск
#[ruststream::app] генерирует main, поэтому бинарник уже понимает команды фреймворка:
cargo run -- run # или: ruststream run, если установлен CLI
cargo run -- run запускает рантайм tokio. Сервис работает, пока вы не нажмёте Ctrl+C.
Брокер очереди для запуска не нужен. Шаблон включает фичу logging, поэтому сервис выводит
журнал в терминал, а обработчики пишут в него через tracing.
Генерация AsyncAPI-документа
cargo run -- asyncapi gen
Команда печатает AsyncAPI-документ в формате JSON. Флаги вывода (-o, --yaml) и сам документ
разобраны в модуле asyncapi.
Как выглядит точка входа
Точка входа - это функция, которая собирает сервис: подключает брокер и монтирует на нём роутер.
#[ruststream::app] превращает её в main.
- Макросы
- Вручную
mod orders;
mod routes;
use ruststream::memory::MemoryBroker;
use ruststream::runtime::{AppInfo, RustStream};
#[ruststream::app]
fn app() -> RustStream {
RustStream::new(AppInfo::new("orders-service", "0.1.0")).with_broker(MemoryBroker::new(), |b| {
let router = routes::orders();
b.include_router(router);
})
}
mod orders;
mod routes;
use std::process::ExitCode;
use ruststream::memory::prelude::*;
use ruststream::runtime::cli::run_main;
fn app() -> RustStream {
RustStream::new(AppInfo::new("orders-service", "0.1.0")).with_broker(MemoryBroker::new(), |b| {
let router = routes::orders();
b.include_router(router);
})
}
// What `#[ruststream::app]` writes around the builder: the `run` and `asyncapi gen` commands.
fn main() -> ExitCode {
run_main(app)
}
Что дальше
- Учебник разбирает каждую часть сервиса.
- Подписчики описывают все формы обработчиков.
- CLI управляет сервисом из командной строки.