Servislerinizi bir araya getirin.
Bağımlılıkları ve yaşam sürelerini tanımlayın. Container, servisleri oluşturur, bağımlılıklarını çözer ve yaşam süreleri sona erdiğinde temizler.
Bağımlılıkları ve yaşam döngüsünü Lily yönetsin. HTTP API’lerden gerçek zamanlı bağlantılara, aynı temelde geliştirin.
Typed API’ler Yerleşik DI Yönetilen yaşam döngüsü
HTTP isteği, WebSocket mesajı ya da kuyruktaki bir iş. Uygulamanın merkezinde aynı bağımlılık modeli ve açık bir kaynak sahipliği var.
Bağımlılıkları ve yaşam sürelerini tanımlayın. Container, servisleri oluşturur, bağımlılıklarını çözer ve yaşam süreleri sona erdiğinde temizler.
Lily uygulamanın yaşam döngüsünü üstlenir. Hazırlık, çalışma ve kapanış adımlarının sorumlulukları bellidir.
Container, controller’lar ve politikalar hazırlanır.
Listener açılır; istek veya mesaj kabulü başlar.
Yeni iş durur; yönetilen kaynakların kapanışı beklenir.
İhtiyacınız olan giriş noktasını seçin. İlk uygulamadan ileri konulara, örneklerle adım adım ilerleyin.
lily_http_apiController’lar, typed request ve response’lar ile API’nizi kurun. Güvenlik ve veri katmanını aynı uygulamaya bağlayın.
lily_websocketBağlantıları, mesajları ve oda yayınlarını yönetin. Gerçek zamanlı iletişimi typed controller’larla geliştirin.
lily_consumerRabbitMQ mesajlarını typed handler’larla işleyin. Kuyrukları, transaction’ları ve kapanışı aynı uygulama yaşam döngüsüyle yönetin.
Projenizi seçin, komutları çalıştırın ve kodu src/main.rs dosyasına yapıştırın. İlk yanıtınızı hemen alın.
Bir endpoint, tek Rust dosyası. İlk HTTP yanıtınızı alın.
Rust 1.96.1+ · Komutlar Bash / Zsh içindir.cargo new --bin --edition 2024 api
cd api
cargo add lilyrs@0.1.0 --features http-api
cargo add tokio@1 --features macros,rt-multi-threadsrc/main.rs dosyasının tamamını aşağıdaki kodla değiştirin.
use std::sync::Arc;
use lilyrs::http_api::{
controller, AppBuilder, Controller, ControllerInitError, ControllerTrait,
Extensions, HttpApiError,
};
#[derive(Controller)]
#[base_path("/api")]
struct HelloController;
#[lilyrs::http_api::async_trait::async_trait]
impl ControllerTrait for HelloController {
async fn new(_: Arc<Extensions>) -> Result<Self, ControllerInitError> {
Ok(Self)
}
}
#[controller]
impl HelloController {
#[get("/hello")]
async fn hello(&self) -> Result<String, HttpApiError> {
Ok("Hello, Lily!".into())
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
AppBuilder::new("127.0.0.1:8080")
.tls_disabled()
.build().await?
.start().await?;
Ok(())
}Proje dizininde çalıştırın. Uygulamayı kapatmak için Ctrl+C kullanın.
cargo runBaşka bir terminalde çalıştırın.
curl http://127.0.0.1:8080/api/helloYanıtta Hello, Lily! mesajını göreceksiniz.
Bir mesaj gönderin, aynısını geri alın. Sunucunun tamamı tek Rust dosyasında.
Rust 1.96.1+ · Komutlar Bash / Zsh içindir.cargo new --bin --edition 2024 websocket
cd websocket
cargo add lilyrs@0.1.0 --features websocket
cargo add tokio@1 --features macros,rt-multi-threadsrc/main.rs dosyasının tamamını aşağıdaki kodla değiştirin.
use std::sync::Arc;
use lilyrs::websocket::{
async_trait, websocket_controller, Emit, Extensions, Payload, ServerConfig,
WebSocketActionError, WebSocketController, WebSocketControllerInitError,
WebSocketControllerTrait, WsAppBuilder,
};
#[derive(WebSocketController)]
#[namespace("hello")]
struct HelloController;
#[async_trait]
impl WebSocketControllerTrait for HelloController {
async fn new(_: Arc<Extensions>) -> Result<Self, WebSocketControllerInitError> {
Ok(Self)
}
}
#[websocket_controller]
impl HelloController {
#[message("echo")]
async fn echo(&self, Payload(text): Payload<String>)
-> Result<Emit<String>, WebSocketActionError>
{
Emit::new("hello:echoed", text).map_err(WebSocketActionError::internal)
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
WsAppBuilder::new("127.0.0.1:8081")
.config(ServerConfig {
allow_missing_origin: true,
require_subprotocol: true,
..ServerConfig::default()
})
.build().await?
.start().await?;
Ok(())
}Proje dizininde çalıştırın. Uygulamayı kapatmak için Ctrl+C kullanın.
cargo runNode.js 22 veya üstüyle başka bir terminalde çalıştırın. Bu istemci Origin göndermediği için sunucuda allow_missing_origin açıktır; lily.v2 subprotocol zorunludur.
node --input-type=module -e '
const socket = new WebSocket("ws://127.0.0.1:8081/ws?namespace=hello", "lily.v2");
socket.addEventListener("open", () => socket.send(JSON.stringify({
protocol_version: 2, msg_type: "event", event: "hello:echo",
content_kind: "json", content_type: "application/json",
encoding: "identity", data: "Hello, Lily!", timestamp: Date.now()
})));
socket.addEventListener("message", ({ data }) => {
console.log(JSON.parse(data));
socket.close();
});
'Yanıtın event alanı hello:echoed, data alanı Hello, Lily! olur.
Bir kuyruk mesajını terminale yazdırın. Worker tek Rust dosyasında; yerel RabbitMQ için Docker gerekir.
Rust 1.96.1+ · Komutlar Bash / Zsh içindir.cargo new --bin --edition 2024 consumer
cd consumer
cargo add lilyrs@0.1.0 --features consumer
cargo add tokio@1 --features macros,rt-multi-threadDocker çalışırken bu komutları bir kez uygulayın. AMQP ve yönetim portları yalnızca yerel makineye açılır. İkinci komut RabbitMQ hazır olana kadar bekler.
docker run --detach --rm --name lily-quickstart-rabbitmq \
-p 127.0.0.1:5672:5672 -p 127.0.0.1:15672:15672 \
rabbitmq:4.3.4-management
curl --retry 30 --retry-all-errors --retry-delay 1 --fail \
--user guest:guest \
http://127.0.0.1:15672/api/health/checks/ready-to-serve-clientsConsumer proje dizininde çalıştırın. Komut lily.toml dosyasını bağlantı ve kuyruk ayarlarıyla oluşturur.
cat > lily.toml <<'TOML'
[rabbitmq.consumer]
hostname = "127.0.0.1"
port = 5672
username = "guest"
password = "guest"
vhost = "/"
use_tls = false
pool_size = 1
[[rabbitmq.topology.queues]]
name = "hello.messages"
exchange_name = "hello"
routing_key = "hello.messages"
concurrency = 1
prefetch_count = 10
[rabbitmq.topology.queues.retention]
main_max_messages = 1000
main_max_bytes = 10485760
retry_bucket_max_messages = 1000
retry_bucket_max_bytes = 10485760
dead_letter_max_messages = 1000
dead_letter_max_bytes = 10485760
TOMLsrc/main.rs dosyasının tamamını aşağıdaki kodla değiştirin.
use lilyrs::{
consumer::{Consumer, ConsumerError, Injectable, ServiceTrait},
queue::{Json, QueueHandlerError, queue, queue_service},
};
#[derive(Default, Injectable)]
#[service(lifetime = "Singleton")]
struct HelloWorker;
impl ServiceTrait for HelloWorker {}
#[queue_service]
impl HelloWorker {
#[queue("hello.messages", version = 1, content = "json")]
async fn hello(&self, Json(text): Json<String>) -> Result<(), QueueHandlerError> {
println!("{text}");
Ok(())
}
}
#[tokio::main]
async fn main() -> Result<(), ConsumerError> {
Consumer::run().await
}Proje dizininde çalıştırın. Uygulamayı kapatmak için Ctrl+C kullanın.
cargo runConsumer başladıktan sonra başka bir terminalde çalıştırın. Bu deneme RabbitMQ yönetim API’sini kullanır; uygulamanızdan yayınlamak için rehberdeki QueueClientService örneğine geçin.
curl --fail-with-body --user guest:guest \
--header 'Content-Type: application/json' \
--request POST http://127.0.0.1:15672/api/exchanges/%2F/hello/publish \
--data '{
"properties": {
"content_type": "application/json",
"headers": {
"x-lily-event-id": "11111111-1111-4111-8111-111111111111",
"x-lily-schema-version": "1",
"x-lily-content-kind": "json"
}
},
"routing_key": "hello.messages",
"payload": "\"Hello, Lily!\"",
"payload_encoding": "string"
}'curl yanıtı routed: true olur; Consumer terminalinde Hello, Lily! yazısını görürsünüz.
Önce Consumer’ı Ctrl+C ile kapatın, ardından örneğin RabbitMQ container’ını durdurun.
docker stop lily-quickstart-rabbitmqVeritabanından güvenliğe, dosya aktarımından gözlemlenebilirliğe. Her konunun kurulumu ve kullanım sınırları rehberlerde.
DI ile bağlantıları ve veri erişimini yönetin.
PostgreSQL MongoDB Cache ve HTTP clientKimlik ve erişim kurallarını akışa bağlayın.
Authentication CORS CSRFSözleşmeleri ve veri aktarımını tanımlayın.
OpenAPI Dosya yükleme Streaming ve dosyalarTrafiği sınırlayın, çalışan sistemi izleyin.
Rate limiting Gözlemlenebilirlik WebSocket shutdown
BİR SONRAKİ ADIMKurulumdan ilk yanıta. Lily’yi kod yazarak tanıyın.
Tek paket. İhtiyacınız olan bileşenler. lilyrs 0.1.0
cargo add lilyrs@0.1.0 --features http-apiHTTP API için http-api, gerçek zamanlı bağlantılar için websocket, mesaj tüketimi için consumer feature’ını seçin.