تقديم التطبيق
شغّل خادم ويب وظيفيًا
تقديم التطبيق درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
خادم Ember
يشغّل http4s تطبيق HttpApp[F] على واجهة خلفية. والخيار الحديث الافتراضي هو Ember، وهو خادم مكتوب بالكامل بـ Scala ومبني على cats-effect وfs2، ومتاح باسم org.http4s.ember.server.EmberServerBuilder.
قد تستخدم التطبيقات الأقدم Blaze، لكن Ember هو المسار الموصى به مستقبلًا.
// build.sbt
// "org.http4s" %% "http4s-ember-server" % http4sVبناء الخادم
يوفر EmberServerBuilder.default[F] بانيًا تضبطه بطريقة تسلسلية: اربطه بالمضيف والمنفذ، وأرفق التطبيق، ثم استدعِ .build للحصول على Resource[F, Server].
يضمن استخدام Resource تحرير المقبس عند إيقاف التشغيل.
import com.comcast.ip4s._
import org.http4s.ember.server.EmberServerBuilder
EmberServerBuilder.default[IO]
.withHost(ipv4"0.0.0.0")
.withPort(port"8080")
.withHttpApp(app)
.buildثوابت ip4s
يستخدم Ember أنواع ip4s لتوفير شبكة آمنة من ناحية الأنواع. يتحقق مُدرجا ipv4"..." وport"..." أثناء الترجمة، لذا لن يُترجم عنوان غير صالح أو منفذ خارج النطاق.
استورد com.comcast.ip4s._ للوصول إليهما.
import com.comcast.ip4s._
val host = host"localhost"
val p = port"8080"دورة حياة Resource
الخادم عبارة عن Resource لأنه يملك مقبسًا يجب فتحه وإغلاقه بطريقة سليمة. يحافظ resource.use(_ => ...) على تشغيله طوال مدة التأثير الداخلي.
استخدم IO.never للتشغيل حتى تتم مقاطعة العملية.
server.use(_ => IO.never).voidنقطة دخول IOApp
تمتد الفئة الرئيسية لتطبيق http4s من IOApp، الذي يوفر بيئة تشغيل مُدارة من cats-effect. عليك تنفيذ run بحيث يعيد IO[ExitCode].
يتولى IOApp نيابةً عنك مجموعات مؤشرات الترابط، ومعالجة الإشارات، والإيقاف السلس.
import cats.effect.{IO, IOApp, ExitCode}
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] = ???
}دالة Main كاملة
بتجميع الأجزاء: ابنِ مورد الخادم، ثم استخدمه عبر use مع IO.never كي تبقى العملية قيد التشغيل، مع إعادة ExitCode.Success.
هذه هي نقطة الدخول المعتمدة في http4s.
def run(args: List[String]): IO[ExitCode] =
EmberServerBuilder.default[IO]
.withPort(port"8080")
.withHttpApp(app)
.build
.use(_ => IO.never)
.as(ExitCode.Success)تركيب الموارد
تقتني التطبيقات الواقعية أكثر من خادم واحد: تجمع اتصالات قاعدة بيانات، وعميل HTTP، وإعدادات. ركّبها في تعبير for واحد فوق Resource كي تُحرَّر جميعها بترتيب عكسي.
مرّر العملاء الذين تم اقتناؤهم إلى إنشاء المسارات.
for {
client <- EmberClientBuilder.default[IO].build
app = buildApp(client)
srv <- serverResource(app)
} yield srvالإيقاف السلس
بما أن الخادم يعيش داخل Resource، فإن إلغاء الليف، مثلًا عند استقبال SIGTERM تحت IOApp، يشغّل المُنهي الذي يوقف قبول الاتصالات ويغلق المقبس.
يفرغ Ember الطلبات قيد التنفيذ ضمن مهلة إيقاف قابلة للضبط.
EmberServerBuilder.default[IO]
.withShutdownTimeout(30.seconds)
.withHttpApp(app)
.buildالبرمجيات الوسيطة للخادم
غلّف HttpApp النهائي بالبرمجيات الوسيطة للخادم قبل تسليمه إلى الباني. ومن البرمجيات الشائعة Logger وCORS وGZip وErrorHandling.
الترتيب مهم: يرى الغلاف الخارجي الطلب أولًا والاستجابة أخيرًا.
import org.http4s.server.middleware._
val finalApp = Logger.httpApp(true, false)(
CORS.policy.withAllowOriginAll(app)
)الإعدادات
اقرأ المضيف والمنفذ والأسرار من البيئة باستخدام مكتبة إعدادات مثل ciris أو pureconfig، وأعِد الإعدادات كجزء من Resource أو تأثير.
تجنب تثبيت المنافذ في الشيفرة كي تعمل الثنائيات نفسها عبر البيئات المختلفة.
val port = sys.env.get("PORT")
.flatMap(Port.fromString)
.getOrElse(port"8080")الصحة وقابلية الرصد
اعرض مسارًا للتحقق من الحيوية مثل GET /health يعيد 200 كي تتمكن أنظمة التنسيق من فحص العملية. أضف برمجيات وسيطة لتسجيل الطلبات وقياس المؤشرات من أجل الرؤية.
اجعل فحوصات الصحة قليلة التكلفة ومستقلة عن التبعيات كي تعكس حالة العملية لا حالة الخدمات التابعة.
val health = HttpRoutes.of[IO] {
case GET -> Root / "health" => Ok("UP")
}تحقق سريع
تذكّر سبب نمذجة الخادم على أنه Resource.
مراجعة
قدّمت التطبيق باستخدام EmberServerBuilder، وربطته باستخدام ثوابت ip4s، وشغّلته من IOApp عبر build.use(_ => IO.never).
ركّبت الموارد، وغلّفت البرمجيات الوسيطة، وقرأت الإعدادات من البيئة، واعتمدت على Resource لتحقيق إيقاف سلس.
الأسئلة الشائعة
هل درس «تقديم التطبيق» مجاني؟
نعم — نص درس «تقديم التطبيق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «تقديم التطبيق»؟
شغّل خادم ويب وظيفيًا تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تقديم التطبيق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.