API Gateway للخدمات المصغرة بلغة Kotlin: عندما يكون مدخل واحد أفضل من ألف

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

API Gateway لخدمات Kotlin: عندما يكون مدخل واحد أفضل من ألف



تخيل أن حديقة الخدمات المصغرة الخاصة بك بلغة Kotlin نمت إلى أكثر من 20 خدمة. كل منها يتصل بالعالم من خلال منفذه الخاص، ويتطلب مصادقته الخاصة، ويعالج الأخطاء بطريقته الخاصة. يرتبك العملاء في نقاط النهاية، وأنت تدعو كل ليلة ألا تسقط خدمة زائدة وتدفن معها التطبيق بأكمله. هل يبدو ذلك مألوفًا؟



هناك حل — API Gateway. إنها نقطة دخول واحدة تتولى التوجيه، الأمان، التخزين المؤقت، والمراقبة. اليوم سنشرح كيفية بناء مثل هذه البوابة بلغة Kotlin باستخدام نهجين شائعين: Ktor الخفيف و Spring Cloud Gateway الصناعي. لا ماء — فقط كود وتطبيق عملي.



ما هو API Gateway ولماذا تحتاجه؟



API Gateway (بوابة API) هي طبقة وسيطة بين العملاء والخدمات المصغرة الخاصة بك. بدلاً من أن يعرف كل واجهة أمامية أو تطبيق خارجي عناوين جميع خدماتك، فإنها تتواصل فقط مع البوابة. وهي بدورها تقرر إلى أين توجيه الطلب.



الوظائف الرئيسية للبوابة:

  • التوجيه — توجيه الطلبات إلى الخدمات المناسبة بناءً على URL أو الرؤوس.
  • المصادقة والتفويض — التحقق من الرموز المميزة قبل وصول الطلب إلى منطق الأعمال.
  • موازنة التحميل — توزيع الطلبات بين مثيلات الخدمة الواحدة.
  • التخزين المؤقت — حفظ الردود للبيانات المطلوبة بشكل متكرر.
  • المراقبة وتسجيل السجلات — جمع المقاييس لجميع الطلبات في مكان واحد.
  • تحديد المعدل — الحماية من هجمات DDoS والتحميل الزائد.


إذا كنت تكتب بلغة Kotlin وتستخدم بنية الخدمات المصغرة، فإن API Gateway هو أمر لا غنى عنه، وليس خيارًا. بدونه، تخاطر بالفوضى من نقاط النهاية المتناثرة ومشاكل الأمان.



النهج 1: API Gateway باستخدام Ktor — الخفة والمرونة



Ktor هو إطار عمل من JetBrains، تم إنشاؤه خصيصًا لـ Kotlin. إنه غير متزامن، خفيف الوزن، ومثالي لكتابة البوابات عندما لا ترغب في سحب Spring Boot الثقيل.



لنكتب بوابة API بسيطة باستخدام Ktor، تقوم بتوجيه الطلبات إلى خدمتين: user-service (المستخدمون) و order-service (الطلبات).



الخطوة 1: إعداد المشروع



أنشئ مشروع Ktor جديدًا عبر start.ktor.io أو أضف التبعيات يدويًا في build.gradle.kts:



dependencies {    implementation("io.ktor:ktor-server-core:2.3.7")    implementation("io.ktor:ktor-server-netty:2.3.7")    implementation("io.ktor:ktor-client-core:2.3.7")    implementation("io.ktor:ktor-client-cio:2.3.7")    implementation("io.ktor:ktor-server-auth:2.3.7")    implementation("io.ktor:ktor-server-content-negotiation:2.3.7")    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")    implementation("ch.qos.logback:logback-classic:1.4.14")}


الخطوة 2: التوجيه الأساسي مع البروكسي



لننشئ الملف الرئيسي Application.kt:



import io.ktor.client.*import io.ktor.client.request.*import io.ktor.client.statement.*import io.ktor.http.*import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.response.*import io.ktor.server.routing.*

fun main() { embeddedServer(Netty, port = 8080) { module() }.start(wait = true)}

fun Application.module() { val httpClient = HttpClient()

routing { // بروكسي لـ user-service route("/api/users") { handle { val response = httpClient.get("http://localhost:8081${call.request.uri}") call.respondText( text

المدونات

توصيات الكتب