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:
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#
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(())
}Ö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.