Aleph stellt Daten aus dem Netzwerk als Manifold-Stream bereit, der problemlos in einen java.io.InputStream
, core.async-Kanal, eine Clojure-Sequenz oder viele andere Byte-Darstellungen umgewandelt werden kann. Es stellt einfache Standard-Wrapper für HTTP, TCP und UDP bereit, ermöglicht aber den Zugriff auf die volle Leistung und Flexibilität der zugrunde liegenden Netty-Bibliothek.
Leiningen:
[aleph " 0.8.2 " ]
deps.edn:
aleph/aleph { :mvn/version " 0.8.2 " }
; ; alternatively
io.github.clj-commons/aleph { :git/sha " ... " }
Aleph folgt vollständig der Ring-Spezifikation und kann ein direkter Ersatz für jeden vorhandenen Ring-kompatiblen Server sein. Es ist jedoch auch möglich, dass die Handlerfunktion ein verzögertes Manifold zurückgibt, um eine eventuelle Antwort darzustellen. Diese Funktion funktioniert möglicherweise nicht gut mit synchroner Ring-Middleware, die die Antwort ändert. Dies kann jedoch leicht behoben werden, indem die Middleware mithilfe des Let-Flow-Operators von Manifold neu implementiert wird. Der aleph.http/wrap-ring-async-handler
Helfer kann verwendet werden, um einen asynchronen 3-Arity-Ring-Handler in einen Aleph-kompatiblen zu konvertieren.
( require '[aleph.http :as http])
( defn handler [req]
{ :status 200
:headers { " content-type " " text/plain " }
:body " hello! " })
( http/start-server handler { :port 8080 }) ; HTTP/1-only
; ; To support HTTP/2, do the following:
; ; (def my-ssl-context ...)
( http/start-server handler { :port 443
:http-versions [ :http2 :http1 ]
:ssl-context my-ssl-context})
; ; See aleph.examples.http2 for more details
Der Hauptteil der Antwort kann auch ein Manifold-Stream sein, bei dem jede Nachricht aus dem Stream als Block gesendet wird, was eine präzise Kontrolle über gestreamte Antworten für vom Server gesendete Ereignisse und andere Zwecke ermöglicht.
Für HTTP-Client-Anfragen modelliert sich Aleph nach clj-http, mit der Ausnahme, dass jede Anfrage sofort ein Manifold deferred zurückgibt, das die Antwort darstellt.
( require
'[aleph.http :as http]
'[manifold.deferred :as d]
'[clj-commons.byte-streams :as bs])
( -> @( http/get " https://google.com/ " )
:body
bs/to-string
prn)
( d/chain ( http/get " https://google.com " )
:body
bs/to-string
prn)
; ; To support HTTP/2, do the following:
( def conn-pool
( http/connection-pool { :connection-options { :http-versions [ :http2 :http1 ]}}))
@( http/get " https://google.com " { :pool conn-pool})
; ; See aleph.examples.http2 for more details
Aleph versucht, die API und Funktionen von clj-http vollständig nachzuahmen. Es unterstützt Multipart-/Formulardatenanfragen, Cookie-Speicher, Proxyserver und Anfrageprüfung mit einigen bemerkenswerten Unterschieden:
Beim Einrichten eines Verbindungspools sollte für die Verbindung eine Proxy-Konfiguration festgelegt werden. Proxy-Setups auf Anfrage sind nicht zulässig
Die HTTP-Proxy-Funktionalität wird um Tunneleinstellungen, optionale HTTP-Header und Verbindungszeitüberschreitungskontrolle erweitert, siehe alle Konfigurationsschlüssel
:proxy-ignore-hosts
wird nicht unterstützt
Sowohl die Cookie-Middleware als auch die integrierten Cookie-Speicher unterstützen keine Cookie-Parameter, die seit RFC2965 veraltet sind: Kommentar, Kommentar-URL, Verwerfen, Version (siehe die vollständige Struktur des Cookies)
bei Verwendung von :debug
, :save-request?
und :debug-body?
Optionen würden entsprechende Anfragen in den Schlüsseln :aleph/netty-request
, :aleph/request
, :aleph/request-body
der Antwortzuordnung gespeichert
Die Option :response-interceptor
wird nicht unterstützt
Aleph führt die Konfiguration des Verbindungspools :log-activity
ein, um die Protokollierung von Verbindungsstatusänderungen sowie Hex-Dumps für Anfragen/Antworten einzuschalten
Die Optionen :cache
und :cache-config
werden derzeit nicht unterstützt
Der Aleph-Client unterstützt außerdem einen vollständig asynchronen und hochgradig anpassbaren DNS-Resolver.
Um mehr zu erfahren, lesen Sie den Beispielcode.
Ab 0.7.0 unterstützt Aleph HTTP/2 sowohl im Client als auch im Server.
Die HTTP/2-Unterstützung von Aleph ist größtenteils ein direkter Ersatz für HTTP/1. Aus Gründen der Abwärtskompatibilität verwendet Aleph jedoch standardmäßig nur HTTP/1. Einen guten Überblick über die ersten Schritte mit HTTP/2 finden Sie im Beispiel-HTTP/2-Code.
Dinge, die Sie beachten sollten:
pipeline-transform
verwendet haben, um die zugrunde liegende Netty-Pipeline zu ändern, müssen Sie Ihre Verwendung für HTTP/2 überprüfen. Unter der Haube nutzt der neue HTTP/2-Code Nettys Multiplex-Pipeline-Setup mit einer gemeinsam genutzten Pipeline auf Verbindungsebene, die streamspezifische Frames an N Pipelines weiterleitet, die für N einzelne Streams erstellt wurden. (Ein Standard-HTTP-Anfrage-/Antwortpaar wird einem einzelnen H2-Stream zugeordnet.) Bei jeder HTTP-Anfrage, die über die richtigen Upgrade
Header verfügt, können Sie (aleph.http/websocket-connection req)
aufrufen, was einen verzögerten Wert zurückgibt, der einen Duplex-Stream ergibt, der einen einzelnen Stream zur Darstellung der bidirektionalen Kommunikation verwendet. Nachrichten des Kunden können über take!
empfangen werden. , und per put!
an den Client gesendet. . Ein Echo-WebSocket-Handler würde dann nur aus Folgendem bestehen:
( require '[manifold.stream :as s])
( defn echo-handler [req]
( let [s @( http/websocket-connection req)]
( s/connect s s)))
Dadurch werden alle Nachrichten vom Client entgegengenommen, in den Duplex-Socket zurückgespeist und an den Client zurückgegeben. WebSocket-Textnachrichten werden als Zeichenfolgen und Binärnachrichten als Byte-Arrays ausgegeben.
WebSocket-Clients können über (aleph.http/websocket-client url)
erstellt werden, wodurch ein verzögerter Stream zurückgegeben wird, der einen Duplex-Stream ergibt, der Nachrichten vom Server senden und empfangen kann.
Um mehr zu erfahren, lesen Sie den Beispielcode.
Ein TCP-Server ähnelt einem HTTP-Server, außer dass der Handler für jede Verbindung zwei Argumente akzeptiert: einen Duplex-Stream und eine Karte mit Informationen über den Client. Der Stream gibt Byte-Arrays aus, die mithilfe der Byte-Streams-Bibliothek in andere Byte-Darstellungen umgewandelt werden können. Der Stream akzeptiert alle Nachrichten, die in eine binäre Darstellung umgewandelt werden können.
Ein Echo-TCP-Server ist dem obigen WebSocket-Beispiel sehr ähnlich:
( require '[aleph.tcp :as tcp])
( defn echo-handler [s info]
( s/connect s s))
( tcp/start-server echo-handler { :port 10001 })
Über (aleph.tcp/client {:host "example.com", :port 10001})
kann ein TCP-Client erstellt werden, der einen verzögerten Stream zurückgibt, der einen Duplex-Stream ergibt.
Um mehr zu erfahren, lesen Sie den Beispielcode.
Ein UDP-Socket kann mit (aleph.udp/socket {:port 10001, :broadcast? false})
generiert werden. Wenn :port
angegeben wird, ergibt sich ein Duplex-Socket, der zum Senden und Empfangen von Nachrichten verwendet werden kann, die als Karten mit den folgenden Daten strukturiert sind:
{ :host " example.com "
:port 10001
:message ...}
Eingehende Pakete verfügen über eine :message
, bei der es sich um ein Byte-Array handelt, das mithilfe von byte-streams
umgewandelt werden kann, und ausgehende Pakete können beliebige Daten sein, die in eine binäre Darstellung umgewandelt werden können. Wenn kein :port
angegeben ist, kann der Socket nur zum Senden von Nachrichten verwendet werden.
Um mehr zu erfahren, lesen Sie den Beispielcode.
Aleph nutzt Leiningen zum Verwalten von Abhängigkeiten, zum Ausführen von REPLs und Tests sowie zum Erstellen des Codes.
Die minimale tools.deps
Unterstützung ist in Form einer deps.edn
Datei verfügbar, die aus project.clj
generiert wird. Es bietet gerade genug, um Aleph als Git- oder :local/root
-Abhängigkeit verwenden zu können. Wenn Sie Änderungen an project.clj
festschreiben, führen Sie deps/lein-to-deps
aus und übernehmen Sie auch die resultierenden Änderungen.
Copyright © 2010-2024 Zachary Tellman
Verteilt unter der MIT-Lizenz.
Vielen Dank an YourKit für die Unterstützung von Aleph. YourKit unterstützt Open-Source-Projekte mit innovativen und intelligenten Tools zur Überwachung und Profilierung von Java- und .NET-Anwendungen.
YourKit ist der Entwickler von YourKit Java Profiler, YourKit .NET Profiler und YourKit YouMonitor.