يعرض Aleph البيانات من الشبكة كتدفق متعدد، والذي يمكن تحويله بسهولة إلى 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 مواصفات Ring بالكامل، ويمكن أن يكون بديلاً مباشرًا لأي خادم موجود متوافق مع Ring. ومع ذلك، فإنه يسمح أيضًا لوظيفة المعالج بإرجاع المشعب المؤجل لتمثيل الاستجابة النهائية. قد لا تعمل هذه الميزة بشكل جيد مع البرنامج الوسيط Ring المتزامن الذي يعدل الاستجابة، ولكن يمكن إصلاح ذلك بسهولة عن طريق إعادة تنفيذ البرنامج الوسيط باستخدام عامل التشغيل Let-flow الخاص بـ Manifold. يمكن استخدام المساعد aleph.http/wrap-ring-async-handler
لتحويل معالج Ring 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 نفسه بعد 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 وإمكاناتها بشكل كامل. وهو يدعم طلبات بيانات النماذج/الأجزاء المتعددة، ومخازن ملفات تعريف الارتباط، والخوادم الوكيلة، وفحص الطلبات مع بعض الاختلافات الملحوظة:
يجب تعيين تكوين الوكيل للاتصال عند إعداد تجمع اتصال، ولا يُسمح بإعدادات الوكيل لكل طلب
يتم توسيع وظيفة وكيل HTTP من خلال إعدادات الاتصال النفقي ورؤوس HTTP الاختيارية والتحكم في مهلة الاتصال، راجع جميع مفاتيح التكوين
:proxy-ignore-hosts
غير مدعوم
لا تدعم كل من البرامج الوسيطة لملفات تعريف الارتباط ومخازن ملفات تعريف الارتباط المضمنة معلمات ملفات تعريف الارتباط التي عفا عليها الزمن منذ RFC2965: التعليق، وعنوان URL للتعليق، والتجاهل، والإصدار (راجع البنية الكاملة لملف تعريف الارتباط)
عند استخدام :debug
, :save-request?
و :debug-body?
الخيارات، سيتم تخزين الطلبات المقابلة في :aleph/netty-request
، :aleph/request
، :aleph/request-body
مفاتيح خريطة الاستجابة
:response-interceptor
غير مدعوم
يقدم Aleph تكوين تجمع الاتصال :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 واحد.) في أي طلب HTTP يحتوي على ترويسات Upgrade
المناسبة، يمكنك استدعاء (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، باستثناء أن المعالج يأخذ وسيطتين لكل اتصال: دفق مزدوج وخريطة تحتوي على معلومات حول العميل. سيُصدر الدفق مصفوفات بايت، والتي يمكن إجبارها على تمثيلات بايت أخرى باستخدام مكتبة تدفقات البايت. سيقبل الدفق أي رسائل يمكن إجبارها على تمثيل ثنائي.
يشبه خادم echo 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 ...}
حيث ستحتوي الحزم الواردة على :message
عبارة عن مصفوفة بايت، والتي يمكن إجبارها باستخدام byte-streams
، ويمكن أن تكون الحزم الصادرة أي بيانات يمكن إجبارها على تمثيل ثنائي. إذا لم يتم تحديد :port
فيمكن استخدام المقبس فقط لإرسال الرسائل.
لمعرفة المزيد، اقرأ رمز المثال.
يستخدم Aleph Leiningen لإدارة التبعيات، وتشغيل REPLs والاختبارات، وبناء التعليمات البرمجية.
يتوفر الحد الأدنى من دعم tools.deps
في شكل ملف deps.edn
الذي يتم إنشاؤه من project.clj
. إنه يوفر ما يكفي لتتمكن من استخدام Aleph باعتباره تبعية git أو :local/root
. عند تنفيذ التغييرات على project.clj
، قم بتشغيل deps/lein-to-deps
وقم بتنفيذ التغييرات الناتجة أيضًا.
حقوق الطبع والنشر © 2010-2024 زاكاري تيلمان
وزعت بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.
شكرًا جزيلاً لـ YourKit لدعم Aleph. يدعم YourKit المشاريع مفتوحة المصدر باستخدام أدوات مبتكرة وذكية لمراقبة تطبيقات Java و.NET وتحديد مواصفاتها.
YourKit هو منشئ ملفات تعريف YourKit Java وYourKit .NET Profiler وYourKit YouMonitor.