Aleph は、ネットワークからのデータを Manifold ストリームとして公開します。これはjava.io.InputStream
、 core.async チャネル、Clojure シーケンス、またはその他の多くのバイト表現に簡単に変換できます。 HTTP、TCP、UDP の単純なデフォルト ラッパーを公開しますが、基盤となる Netty ライブラリの完全なパフォーマンスと柔軟性にアクセスできます。
ライニンゲン:
[aleph " 0.8.2 " ]
開発者編:
aleph/aleph { :mvn/version " 0.8.2 " }
; ; alternatively
io.github.clj-commons/aleph { :git/sha " ... " }
Aleph は Ring 仕様に完全に従っており、既存の Ring 準拠サーバーのドロップイン代替品として使用できます。ただし、ハンドラー関数が最終的な応答を表すために遅延されたマニホールドを返すこともできます。この機能は、応答を変更する同期リング ミドルウェアでは適切に動作しない可能性がありますが、これは Manifold の let-flow オペレータを使用してミドルウェアを再実装することで簡単に修正できます。 aleph.http/wrap-ring-async-handler
ヘルパーを使用して、非同期 3 引数リング ハンドラーを Aleph 準拠のものに変換できます。
( 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
応答の本文はマニホールド ストリームである場合もあります。この場合、ストリームからの各メッセージはチャンクとして送信され、サーバー送信イベントやその他の目的でストリーミングされた応答を正確に制御できます。
HTTP クライアント要求の場合、Aleph は clj-http に倣ってモデル化しますが、すべての要求が応答を表す遅延マニホールドを即座に返す点が異なります。
( 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 は、clj-http API と機能を完全に模倣しようとしています。マルチパート/フォームデータ リクエスト、Cookie ストア、プロキシ サーバー、およびリクエスト インスペクションをサポートしていますが、いくつかの顕著な違いがあります。
接続プールの設定時に接続に対してプロキシ構成を設定する必要があります。リクエストごとのプロキシ設定は許可されていません
HTTP プロキシ機能は、トンネリング設定、オプションの HTTP ヘッダー、接続タイムアウト制御によって拡張されています。すべての構成キーを参照してください。
:proxy-ignore-hosts
サポートされていません
Cookie ミドルウェアと組み込み Cookie ストレージはどちらも、RFC2965 以降廃止された Cookie パラメータ (コメント、コメント URL、破棄、バージョン) をサポートしていません (Cookie の完全な構造を参照)
:debug
、 :save-request?
そして:debug-body?
オプションを使用すると、対応するリクエストはレスポンス マップの:aleph/netty-request
、 :aleph/request
、 :aleph/request-body
キーに保存されます。
:response-interceptor
オプションはサポートされていません
Aleph では、接続ステータスの変更とリクエスト/レスポンスの 16 進ダンプのロギングをオンにする:log-activity
接続プール設定を導入しています。
:cache
および:cache-config
オプションは現時点ではサポートされていません
Aleph クライアントは、完全に非同期で高度にカスタマイズ可能な DNS リゾルバーもサポートしています。
詳細については、コード例を参照してください。
0.7.0 の時点で、Aleph はクライアントとサーバーの両方で HTTP/2 をサポートしています。
ほとんどの場合、Aleph の HTTP/2 サポートは HTTP/1 のドロップイン代替品です。ただし、下位互換性のために、Aleph はデフォルトで HTTP/1 のみになっています。 HTTP/2 の使用を開始するための概要については、サンプル HTTP/2 コードを参照してください。
注意すべきこと:
pipeline-transform
使用して基盤となる Netty パイプラインを変更していた場合は、HTTP/2 での使用状況を確認する必要があります。新しい HTTP/2 コードは内部的に、Netty の多重化パイプライン設定を使用しており、N 個の個別ストリーム用に作成された N 個のパイプラインにストリーム固有のフレームを供給する共有接続レベル パイプラインを備えています。 (標準の HTTP 要求/応答のペアは、単一の H2 ストリームにマップされます。)適切なUpgrade
ヘッダーを持つ HTTP リクエストでは、 (aleph.http/websocket-connection req)
を呼び出すことができます。これは、双方向通信を表すために単一のストリームを使用する二重ストリームを生成する遅延を返します。クライアントからのメッセージはtake!
経由で受信可能です。 、そしてput!
経由でクライアントに送信されます。 。したがって、エコー WebSocket ハンドラーは次のものだけで構成されます。
( require '[manifold.stream :as s])
( defn echo-handler [req]
( let [s @( http/websocket-connection req)]
( s/connect s s)))
これはクライアントからすべてのメッセージを取得し、それらを二重ソケットにフィードバックしてクライアントに返します。 WebSocket テキスト メッセージは文字列として出力され、バイナリ メッセージはバイト配列として出力されます。
WebSocket クライアントは、 (aleph.http/websocket-client url)
経由で作成できます。これは、サーバーとメッセージを送受信できる二重ストリームを生成する遅延を返します。
詳細については、コード例を参照してください。
TCP サーバーは HTTP サーバーに似ていますが、接続ごとにハンドラーが 2 つの引数 (二重ストリームとクライアントに関する情報を含むマップ) を取る点が異なります。ストリームはバイト配列を出力します。これは、バイト ストリーム ライブラリを使用して他のバイト表現に強制できます。ストリームは、バイナリ表現に強制できるあらゆるメッセージを受け入れます。
エコー TCP サーバーは、上記の WebSocket の例と非常によく似ています。
( require '[aleph.tcp :as tcp])
( defn echo-handler [s info]
( s/connect s s))
( tcp/start-server echo-handler { :port 10001 })
TCP クライアントは(aleph.tcp/client {:host "example.com", :port 10001})
を介して作成できます。これは、二重ストリームを生成する遅延を返します。
詳細については、コード例を参照してください。
UDP ソケットは(aleph.udp/socket {:port 10001, :broadcast? false})
を使用して生成できます。 :port
を指定すると、メッセージの送受信に使用できる二重ソケットが生成されます。メッセージは、次のデータを含むマップとして構造化されます。
{ :host " example.com "
:port 10001
:message ...}
受信パケットには、 byte-streams
使用して強制できるバイト配列である:message
が含まれ、送信パケットには、バイナリ表現に強制できる任意のデータを指定できます。 :port
が指定されていない場合、ソケットはメッセージの送信にのみ使用できます。
詳細については、コード例を参照してください。
Aleph は、依存関係の管理、REPL とテストの実行、コードの構築に Leiningen を使用します。
最小限のtools.deps
サポートは、 project.clj
から生成されるdeps.edn
ファイルの形式で利用できます。これは、Aleph を git または:local/root
依存関係として使用できるようにするのに十分なものを提供します。 project.clj
への変更をコミットするときは、 deps/lein-to-deps
を実行し、結果の変更もコミットします。
著作権 © 2010-2024 ザカリー・テルマン
MIT ライセンスに基づいて配布されます。
Aleph をサポートしてくださった YourKit に感謝します。 YourKit は、Java および .NET アプリケーションの監視とプロファイリングのための革新的でインテリジェントなツールを備えたオープン ソース プロジェクトをサポートします。
YourKit は、YourKit Java Profiler、YourKit .NET Profiler、および YourKit YouMonitor の作成者です。