ميكروسيرفيسات Swift: الهندسة والممارسة من الألف إلى الياء

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

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

ابدأ الدورة

مقدمة في الخدمات المصغرة باستخدام Swift



تقليديًا، يرتبط Swift بتطوير تطبيقات iOS و macOS. ومع ذلك، مع ظهور إطار العمل Vapor والدعم الأصلي للبرمجة غير المتزامنة (async/await)، دخل Swift بثقة إلى عالم تطوير الخادم. تسمح بنية الخدمات المصغرة باستخدام Swift بإنشاء خدمات خفيفة ومعزولة وقابلة للتوسع، باستخدام بناء جملة مألوف وكتابة صارمة.



في هذه المقالة، سنشرح كيفية تصميم وتنفيذ خدمة مصغرة باستخدام Swift من الصفر: من اختيار بروتوكول التفاعل إلى النشر. ستتعرف على سبب كون Swift خيارًا ممتازًا للخدمات المصغرة الخلفية (backend)، وستحصل على أمثلة جاهزة للكود.



1. بنية الخدمة المصغرة باستخدام Swift: المبادئ الأساسية



1.1. لماذا Swift للخادم الخلفي (backend)؟

يتمتع Swift بعدة مزايا مقارنة باللغات التقليدية للخدمات المصغرة (Java, Python, Go):

  • أمان الذاكرة — عدم وجود تسرب للذاكرة وسباقات الحالة (race condition) بفضل ARC (Automatic Reference Counting).
  • أداء عالٍ — لغة مترجمة، قريبة في السرعة من C++.
  • كتابة صارمة — يتم اكتشاف الأخطاء في مرحلة الترجمة، وليس في وقت التشغيل.
  • النظام البيئي Vapor — إطار ويب قوي مع دعم WebSocket و JWT و Fluent ORM.


1.2. البنية النموذجية للخدمة المصغرة

أي خدمة مصغرة باستخدام Swift تُبنى وفق المخطط التالي:

  • API Gateway — نقطة الدخول، تقوم بتوجيه الطلبات (غالبًا على Nginx أو Vapor).
  • طبقة الخدمة — منطق الأعمال باستخدام Swift (وحدات، بروتوكولات، DI).
  • طبقة البيانات — العمل مع قاعدة البيانات عبر Fluent (PostgreSQL, MySQL, SQLite).
  • التفاعل بين الخدمات — HTTP/REST أو gRPC أو قوائم الانتظار (RabbitMQ, Kafka).


2. التطبيق العملي: إنشاء خدمة مصغرة على Vapor



2.1. تثبيت وإعداد المشروع

سننشئ خدمة مصغرة لإدارة المستخدمين (User Service). تأكد من تثبيت Swift 5.8+ و Vapor Toolbox:

brew install vaporvapor new UserService --template=apicd UserService


2.2. النموذج والترحيل (Migration)

سنحدد نموذج المستخدم باستخدام Fluent:

// Sources/App/Models/User.swiftimport Fluentimport Vapor

final class User: Model, Content { static let schema = "users" @ID(key: .id) var id: UUID? @Field(key: "name") var name: String @Field(key: "email") var email: String @Timestamp(key: "created_at", on: .create) var createdAt: Date? init() { } init(id: UUID? = nil, name: String, email: String) { self.id = id self.name = name self.email = email }}

سننشئ ترحيلًا (Migration):

// Sources/App/Migrations/CreateUser.swiftimport Fluent

struct CreateUser: AsyncMigration { func prepare(on database: Database) async throws { try await database.schema("users") .id() .field("name", .string, .required) .field("email", .string, .required) .field("created_at", .datetime) .create() } func revert(on database: Database) async throws { try await database.schema("users").delete() }}


2.3. وحدة التحكم CRUD مع async/await

سنقوم بتنفيذ REST API للمستخدمين:

// Sources/App/Controllers/UserController.swiftimport Vapor

struct UserController: RouteCollection { func boot(routes: RoutesBuilder) throws { let users = routes.grouped("api", "users") users.get(use: index) users.post(use: create) users.group(":userID") { user in user.get(use: show) user.put(use: update) user.delete(use: delete) } }

المدونات

توصيات الكتب