لماذا Kotlin هو الخيار الأفضل للميكروسيرفيسات في 2024؟
\n\nهل سبق لك أن كتبت ميكروسيرفيس بلغة Python، ثم فكرت: "ماذا لو كان يعمل بشكل أسرع، ويستهلك ذاكرة أقل، مع بقاء الكود بنفس الوضوح؟" مألوف؟ إذن مرحبًا بك في عالم Kotlin - اللغة التي اختارتها Google لنظام Android، واختارها مجتمع مطوري الواجهة الخلفية لبناء ميكروسيرفيسات خفيفة وعالية الأداء.
\n\nتتناسب Kotlin بشكل مثالي مع بنية الميكروسيرفيسات: فهي لغة ثابتة الأنواع (statically typed)، وتُترجم إلى كود بايت JVM (أو كود أصلي عبر Kotlin/Native)، ولكنها لا تتطلب قدرًا هائلاً من الكود التكراري (boilerplate) مثل Java. والأهم من ذلك - أن coroutines الخاصة بها تسمح بمعالجة آلاف الطلبات على خيط واحد دون ألم callback hell.
\n\nفي هذه المقالة، لن نلقي محاضرات نظرية. سنقوم بكتابة ميكروسيرفيسين: User Service (REST API) و Notification Service (محاكاة إرسال البريد الإلكتروني). كل ذلك بلغة Kotlin الخالصة + Ktor. هيا بنا!
\n\n1. الأدوات: ما يجب تثبيته قبل البدء
\n\nقبل كتابة الكود، دعنا نتأكد من أن جهاز الكمبيوتر الخاص بك جاهز للعمل.
\n\nما يجب تثبيته:
\n- \n
- JDK 17+ - يعمل Kotlin على JVM، لذا لا مفر من Java. يمكن التنزيل من Adoptium. \n
- IntelliJ IDEA Community Edition - أفضل بيئة تطوير متكاملة (IDE) لـ Kotlin (نعم، هي من JetBrains، ونعم، هي مجانية). \n
- Gradle (أو Maven) - نظام بناء. في IntelliJ، هو مدمج بالفعل، ولكن إذا كنت تريد تثبيته بشكل منفصل - gradle.org. \n
- Docker (اختياري، لكنه سيبسط النشر بشكل كبير). \n
إذا كان لديك macOS أو Linux - فأنت بالفعل في منتصف الطريق نحو النجاح. على Windows، أوصي باستخدام WSL2.
\n\n2. إنشاء أول ميكروسيرفيس: User Service على Ktor
\n\nKtor هو إطار عمل من مبتكري Kotlin. إنه خفيف الوزن للغاية: أنت تقرر أي الوحدات (modules) تريد إضافتها (التوجيه، التسلسل، التسجيل). لا يوجد سحر - فقط كود نقي.
\n\n2.1. توليد المشروع
\nأسرع طريقة هي استخدام Ktor Project Generator. اختر:
\n- \n
- نظام البناء: Gradle Kotlin DSL \n
- المحرك: Netty (الأكثر شيوعًا) \n
- الإضافات: Routing, Content Negotiation (JSON), Status Pages \n
قم بتنزيل الأرشيف، وافتحه في IntelliJ - وبعد دقيقتين سيكون لديك هيكل عظمي جاهز.
\n\n2.2. كتابة REST API: الحصول على المستخدمين
\nسننشئ نموذجًا بسيطًا ونقطة نهاية (endpoint). سيكون الكود واضحًا قدر الإمكان:
\n\n// Model.kt\ndata class User(\n val id: Int,\n val name: String,\n val email: String\n)\n\n// UserRepository.kt\nobject UserRepository {\n private val users = mutableListOf(\n User(1, "Alice", "alice@example.com"),\n User(2, "Bob", "bob@example.com")\n )\n\n fun findAll(): List<User> = users\n fun findById(id: Int): User? = users.find { it.id == id }\n}\n\n// Application.kt (نقطة الدخول)\nfun main() {\n embeddedServer(Netty, port = 8080) {\n configureSerialization()\n configureRouting()\n }.start(wait = true)\n}\n\n// Routing.kt\nfun Application.configureRouting() {\n routing {\n route("/api/v1/users") {\n get {\n call.respond(UserRepository.findAll())\n }\n get("/{id}") {\n val id = call.parameters["id"]?.toIntOrNull()\n if (id == null) {\n call.respond(HttpStatusCode.BadRequest, "Invalid ID")\n return@get\n }\n val user = UserRepository.findById(id)\n if (user != null) {\n call.respond(user)\n } else {\n call.respond(HttpStatusCode.NotFound, "User not found")\n