ميكروسيرفيسات Swift: الهندسة والممارسة من الألف إلى الياء
\n\nفي عالم تطوير التطبيقات المحمولة والخوادم، لم يعد Swift مجرد لغة لتطبيقات iOS فقط. بفضل أطر العمل مثل Vapor و Kitura، والدعم الأصلي لنظام Linux، أصبح Swift لغة كاملة لبناء أنظمة الخوادم. في هذه المقالة، سنشرح كيفية تصميم وتنفيذ هندسة الميكروسيرفيسات بلغة Swift - من اختيار الأدوات إلى النشر في بيئة الإنتاج.
\n\n1. لماذا Swift للميكروسيرفيسات؟
\n\nتتطلب هندسة الميكروسيرفيسات أداءً عاليًا وأمانًا وسهولة في الصيانة. يوفر Swift كل ذلك:
\n\n- \n
- الأداء - الكود المترجم بلغة Swift يمكن مقارنته من حيث السرعة مع C++ و Rust. \n
- أمان الأنواع - الحد الأدنى من أخطاء وقت التشغيل بفضل نظام الأنواع الصارم. \n
- بناء جملة حديث - البروتوكولات و async/await و Codable تبسط التطوير. \n
- التعدد المنصات - كود واحد لـ macOS و Linux والبيئات السحابية. \n
إطار العمل الرئيسي لتطوير الخوادم بلغة Swift هو Vapor. يوفر موجهًا قويًا، ودعم WebSocket، و ORM (Fluent)، والتكامل مع Docker.
\n\n2. هندسة الميكروسيرفيس بلغة Swift
\n\nلننظر إلى هندسة نموذجية لميكروسيرفيس مسؤول عن إدارة المستخدمين. سيتضمن:
\n\n2.1 نموذج البيانات
\nimport Vapor\nimport Fluent\n\nfinal class User: Model, Content {\n static let schema = "users"\n \n @ID(key: .id)\n var id: UUID?\n \n @Field(key: "email")\n var email: String\n \n @Field(key: "name")\n var name: String\n \n @Field(key: "password_hash")\n var passwordHash: String\n \n init() {}\n \n init(id: UUID? = nil, email: String, name: String, passwordHash: String) {\n self.id = id\n self.email = email\n self.name = name\n self.passwordHash = passwordHash\n }\n}\n\n2.2 المتحكم مع async/await
\nimport Vapor\n\nstruct UserController: RouteCollection {\n func boot(routes: RoutesBuilder) throws {\n let users = routes.grouped("api", "users")\n users.get(use: index)\n users.post(use: create)\n users.group(":userID") { user in\n user.get(use: show)\n user.delete(use: delete)\n }\n }\n \n @Sendable\n func index(req: Request) async throws -> [User] {\n try await User.query(on: req.db).all()\n }\n \n @Sendable\n func create(req: Request) async throws -> User {\n let user = try req.content.decode(User.self)\n try await user.save(on: req.db)\n return user\n }\n \n @Sendable\n func show(req: Request) async throws -> User {\n guard let user = try await User.find(req.parameters.get("userID"), on: req.db) else {\n throw Abort(.notFound)\n }\n return user\n }\n \n @Sendable\n func delete(req: Request) async throws -> HTTPStatus {\n guard let user = try await User.find(req.parameters.get("userID"), on: req.db) else {\n throw Abort(.notFound)\n }\n try await user.delete(on: req.db)\n return .noContent\n }\n}\n\n2.3 تسجيل المسارات والترحيلات
\nimport Vapor\nimport Fluent\n\nfunc configure(_ app: Application) throws {\n // إعداد قاعدة البيانات (PostgreSQL)\n app.databases.use(.postgres(\n hostname: Environment.get("DB_HOST") ?? "localhost",\n port: Environment.get("DB_PORT").flatMap(Int.init) ?? 5432,\n username: Environment.get("DB_USER") ?? "vapor",\n password: Environment.get("DB_PASS") ?? "password",\n database: Environment.get("DB_NAME") ?? "users_db"\n ), as: .psql)\n \n // الترحيلات\n app.migrations.add(CreateUser())\n \n // تسجيل المتحكم\n try app.regist