lilydocs
HTTP APIWebSocketConsumer
Entegrasyon3 dk okuma

Outbound gateway

BaseGateway ile dış bir servise CRUD bildirimleri gönderin; üretilen client helper’ını server action’larından ayırın.

BaseGateway, dış WebSocket client için bildirim helper'ları üretir. Server'da otomatik CRUD action, subscribe endpoint'i veya oda oluşturmaz. Karşı tarafın controller sözleşmesi ayrıca yazılır.

Bağımlılıklar#

İlk uygulamanın lilyrs, Serde ve Tokio bağımlılıklarını koruyup aşağıdakileri ekleyin:

TOML
lily_websocket_client = { version = "0.1.0", default-features = false }
lily_websocket_derive = "0.1.0"
lily_injection = "0.1.0"
lily_error = "0.1.0"
async-trait = "0.1"
tokio-util = "0.7"

BaseGateway, yayımlanan 0.1.0 facade'inin istisnasıdır: lilyrs::websocket veya lilyrs::websocket_client üzerinden re-export edilmez. Derive ve client import'ları bu örnekte doğrudan yayımlanmış crate'lere gider. Üretilen lifecycle kodu da async_trait, lily_injection ve lily_error yollarını kullanır; bu bağımlılıkları transitive saymayın. Normal DI kurulumu için bu ek bağımlılıklar gerekmez.

Direct client'ın default-features = false seçimi otomatik single kaydını kapalı tutar. Aynı grafikte lilyrs için websocket-client veya client için single açılırsa Cargo feature birleşimi bu tercihi geçersiz kılar; managed client config'i de gerekir. Bu manuel gateway örneğine o feature'ları eklemeyin.

Gateway tanımlayın#

gateway.rs
use lily_websocket_client::{TokioWsClient, WsClient};
use lily_websocket_derive::BaseGateway;
use serde::Serialize;
use tokio_util::sync::CancellationToken;

#[derive(Serialize)]
pub struct OrderDto { pub id: String }

#[derive(BaseGateway)]
#[gateway(url = "ws://127.0.0.1:8081/ws", namespace = "orders")]
#[dto_type(OrderDto)]
pub struct OrdersGateway {
    #[gateway_client]
    client: TokioWsClient,
    entity_name: String,
}

pub async fn publish(order: &OrderDto) -> Result<(), Box<dyn std::error::Error>> {
    let gateway = OrdersGateway::new();
    gateway.client().connect(CancellationToken::new()).await?;
    let result = gateway.notify_created(order).await;
    let closed = gateway.disconnect().await;
    result?;
    closed?;
    Ok(())
}

Tam örnek dosyasını indirin.

Örnek doğrudan client sahipliğini gösterir. Karşı sunucuda orders namespace'i ve created action'ı bulunmalı; Origin göndermeyen istemciye izin verilmelidir. new() bağlantı kurmaz, connect sonucunu beklemek gerekir.

Üretilen bildirimler#

Metot Event
notify_created orders:created
notify_created_many orders:createdMany
notify_updated orders:updated
notify_deleted, notify_deleted_id orders:deleted
notify_deleted_many orders:deletedMany

notify_deleted_id payload olarak ID gönderir; diğer deleted metodu DTO gönderir. Karşı action bu farkı açıkça kabul etmelidir. client, is_connected ve disconnect yardımcıları da üretilir. Bildirimler request/ACK akışı değildir; send başarısını domain işleminin tamamlanması saymayın.

Struct ve lifecycle kuralları#

Struct tam olarak iki alan taşır: #[gateway_client] işaretli TokioWsClient ve entity_name: String. Extra alan generated constructor tarafından kurulamadığı için kabul edilmez. URL ve namespace literal metadata'dır; URL credentials ve hassas query kabul edilmez.

Makro ServiceTrait initialize/dispose üretir. Container discovery kaydını kendiliğinden üretmez; DI-managed kullanımda ayrıca uygun servis kaydı kurun. Manual örnekte connect/disconnect size aittir. Dinamik config veya named bağlantılar için client single/factory modeli daha doğrudan bir başlangıçtır.

Bu sayfanın kaynakları v0.1.0

Anlatım, incelenen framework commit’ine dayanır.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod