Aleph는 네트워크의 데이터를 Manifold 스트림으로 노출합니다. 이는 java.io.InputStream
, core.async 채널, Clojure 시퀀스 또는 기타 여러 바이트 표현으로 쉽게 변환될 수 있습니다. HTTP, TCP 및 UDP에 대한 간단한 기본 래퍼를 노출하지만 기본 Netty 라이브러리의 전체 성능과 유연성에 대한 액세스를 허용합니다.
라이닝겐:
[aleph " 0.8.2 " ]
deps.edn:
aleph/aleph { :mvn/version " 0.8.2 " }
; ; alternatively
io.github.clj-commons/aleph { :git/sha " ... " }
Aleph는 링 사양을 완전히 따르며 기존 링 호환 서버를 즉시 대체할 수 있습니다. 그러나 핸들러 함수가 최종 응답을 나타내기 위해 연기된 매니폴드를 반환하는 것도 허용합니다. 이 기능은 응답을 수정하는 동기식 링 미들웨어에서는 제대로 작동하지 않을 수 있지만 이는 Manifold의 let-flow 연산자를 사용하여 미들웨어를 다시 구현하면 쉽게 해결할 수 있습니다. aleph.http/wrap-ring-async-handler
도우미는 비동기 3-arity 링 핸들러를 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는 모든 요청이 응답을 나타내는 지연된 Manifold를 즉시 반환한다는 점을 제외하고는 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와 기능을 완전히 모방하려고 시도합니다. 멀티파트/양식 데이터 요청, 쿠키 저장소, 프록시 서버 및 몇 가지 눈에 띄는 차이점이 있는 요청 검사를 지원합니다.
연결 풀을 설정할 때 연결에 대한 프록시 구성을 설정해야 하며 요청별 프록시 설정은 허용되지 않습니다.
터널링 설정, 선택적 HTTP 헤더 및 연결 시간 초과 제어를 통해 HTTP 프록시 기능이 확장됩니다. 모든 구성 키 보기
:proxy-ignore-hosts
지원되지 않습니다.
쿠키 미들웨어와 내장 쿠키 저장소는 모두 RFC2965 이후로 사용되지 않는 쿠키 매개변수(주석, 주석 URL, 삭제, 버전)를 지원하지 않습니다(쿠키의 전체 구조 참조).
: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 코드는 N개의 개별 스트림을 위해 생성된 N개의 파이프라인에 스트림별 프레임을 공급하는 공유 연결 수준 파이프라인과 함께 Netty의 다중화 파이프라인 설정을 사용합니다. (표준 HTTP 요청/응답 쌍은 단일 H2 스트림에 매핑됩니다.) 적절한 Upgrade
헤더가 있는 HTTP 요청에서 (aleph.http/websocket-connection req)
호출할 수 있습니다. 이 호출은 단일 스트림을 사용하여 양방향 통신을 나타내는 이중 스트림을 생성하는 지연된 스트림을 반환합니다. 클라이언트의 메시지는 take!
, put!
. 그러면 echo 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 서버와 유사합니다. 스트림은 바이트 스트림 라이브러리를 사용하여 다른 바이트 표현으로 강제 변환될 수 있는 바이트 배열을 내보냅니다. 스트림은 이진 표현으로 강제 변환될 수 있는 모든 메시지를 허용합니다.
에코 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 프로파일러, YourKit .NET 프로파일러 및 YourKit YouMonitor의 작성자입니다.