lilydocs
HTTP APIWebSocketConsumer
Entegrasyon4 dk okuma

Dış WebSocket client

Başka bir Lily servisine bağlanın; direct, DI single veya factory modunda request/ACK ve bağlantı sahipliğini yönetin.

lily_websocket_client dış bir WebSocket sunucusuna bağlanır. Mevcut server bağlantılarına yayın yapan ClientProxy ile farklı bir görev üstlenir. İstemci canonical Lily v2 envelope bekler.

Sahiplik modunu seçin#

Facade feature seçimi Model
websocket-client-di TokioWsClient ve DI yardımcı yüzeyi; single/factory servis kaydı açılmaz, connect/disconnect uygulamaya ait
websocket-client Single modunda DI-managed WebSocketClientService
websocket-client-factory Named client cell'leri için WebSocketClientFactory

Single ve factory birlikte kullanılmaz; factory feature'ını base yerine seçin. Direct TokioWsClient her modda kullanılabilir, ancak websocket-client feature'ı bir server'ın bağımlılık grafiğine eklendiğinde single servis kaydı da açılır ve build sırasında [websocket_client] config'i gerekir. Sadece direct client göstermek için bu yan etkiyi istemiyoruz; aşağıdaki örnek public websocket-client-di profilini seçer. İsmindeki di, tek başına bir managed client kaydı oluşturmaz.

İç __websocket-client feature'ını kullanmayın. DI helper'ları da istemeyen bağımsız bir istemci, alternatif olarak lily_websocket_client = { version = "0.1.0", default-features = false } doğrudan bağımlılığını seçebilir; o durumda import yolu doğrudan crate adı olur. Aynı grafikte başka bir bağımlılık single/factory açarsa feature'lar birleşir. DI modelindeki initialize/dispose sahipliği managed modlarda geçerlidir.

Direct client örneği#

Cargo.toml bağımlılıkları
lilyrs = { version = "0.1.0", features = ["websocket", "websocket-client-di", "websocket-redis"] }
serde_json = "1"
tokio-util = "0.7"

Bu satır ilk uygulamanın lilyrs satırının yerini alır. Dosyadaki distributed fonksiyonu ayrı bir backplane builder örneğidir; yalnız direct client için bu fonksiyonu, websocket_redis import'unu ve websocket-redis feature'ını çıkarabilirsiniz. Bu örnek [websocket_client] config'i veya managed client kaydı gerektirmez; connect ve disconnect kendisine aittir. Server Origin göndermeyen client profiline izin vermelidir.

client.rs
use std::time::Duration;
use lilyrs::websocket::{BackplaneRequirement, WsAppBuilder};
use lilyrs::websocket_client::{TokioWsClient, WebSocketClientConfig, WsClient};
use lilyrs::websocket_redis::RedisWebSocketBackplane;
use tokio_util::sync::CancellationToken;

pub fn distributed(builder: WsAppBuilder) -> WsAppBuilder {
    builder.backplane::<RedisWebSocketBackplane>(BackplaneRequirement::Required)
}
pub async fn direct_client() -> Result<(), Box<dyn std::error::Error>> {
    let client = TokioWsClient::with_config(WebSocketClientConfig {
        url: "ws://127.0.0.1:8081/ws".into(),
        namespace: Some("hello".into()),
        ..WebSocketClientConfig::default()
    })?;
    client.on_async("hello:greeted", |_event, payload| async move {
        println!("Yanıt: {} byte", payload.len());
    });
    client.connect(CancellationToken::new()).await?;
    let result = client.request("hello:confirm", serde_json::json!({"name":"Ada"}),
        Duration::from_secs(2)).await;
    let closed = client.disconnect().await;
    let _reply = result?;
    closed?;
    Ok(())
}

Tam örnek dosyasını indirin.

Fonksiyon request hata verse de disconnect sonucunu önce bekler. Async I/O callback'leri için on_async, kısa senkron işler için on kullanın. Callback queue, concurrency ve timeout bounded'dır; aynı event kaydı önceki listener'ı değiştirir. * wildcard, off kaldırma yoludur.

Request ve delivery#

request yeni ACK ID ayırır. Eşleşen sonuç WebSocketReply::Acknowledgement veya ilişkili Rejection olur. Pending istekler bounded'dır; success, rejection, timeout, cancellation veya disconnect ile kaldırılır. Otomatik request retry yapılmaz.

Late/unknown ACK veya ilişkili error normal event callback'ine düşmez; protokol hatası ve socket kapanışı oluşturur. İlişkisiz error için on_error kullanılır. Direct client send, writer kabul/flush sonucunu gösterir; peer uygulamasının işlediği garantisi değildir. Reconnect başarısız yazıları replay etmez.

DI single#

Single sahiplik için lilyrs feature listesinde websocket-client-di yerine websocket-client seçin. WebSocketClientService container'dan çözülür; generated Default değerini elle kurmayın. Aşağıdaki config, bu managed servisin initialize adımı içindir.

lily.toml
[websocket_client]
mode = "single"
url = "wss://events.example.com/ws"
namespace = "chat"
subprotocols = ["lily.v2"]
require_subprotocol = true
authorization_bearer_file = "/run/secrets/websocket-token"

Initialization ilk connect'i tamamlamadan servisi yayımlamaz. İlk on_connect olayını yakalamak zorunluysa direct client'a callback'i connect'ten önce kaydedin. DI üzerinden sonradan kayıt ilk olayı yeniden üretmez.

DI factory#

Alternatif factory config
[websocket_client]
mode = "factory"

[[websocket_client.cells]]
name = "primary"
url = "wss://primary.example.com/ws"
namespace = "events"

[[websocket_client.cells]]
name = "backup"
url = "wss://backup.example.com/ws"
namespace = "events"

websocket-client yerine websocket-client-factory feature'ıyla WebSocketClientFactory resolve edin, get("primary") sonucunu kontrol edin. Boş/duplicate isimler I/O öncesi reddedilir; sonraki cell connect'i başarısızsa daha önce açılan cell'ler kapatılır. Her client kendi namespace'ine uygun event gönderir; isimleri farklı namespace'e send kestirmesi olarak kullanmayın.

Credential ve TLS#

AuthHeaderProvider ilk handshake ve reconnect öncesinde çalışır. BearerTokenFile token dosyasını yeniden okuyabilir. Bu, açık server bağlantısındaki identity refresh'ten farklıdır. URL user-info veya hassas query parametresiyle credential taşınmaz.

WSS hostname doğrulaması ve WebPKI trust köklerini kullanır; client'ın additional_ca_bundle seçimi public CA ekler. Bu davranış Redis backplane custom CA'sının kökleri değiştirmesinden farklıdır. disconnect supervised runtime'ı bounded biçimde kapatıp join eder; managed client'ı container sahibi kapatır.

Bu sayfanın kaynakları v0.1.0

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

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod