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

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

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

ابدأ الدورة

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

\n\n

في عالم تطوير التطبيقات المحمولة والخوادم، لم يعد Swift مجرد لغة لتطبيقات iOS فقط. بفضل أطر العمل مثل Vapor و Kitura، والدعم الأصلي لنظام Linux، أصبح Swift لغة كاملة لبناء أنظمة الخوادم. في هذه المقالة، سنشرح كيفية تصميم وتنفيذ هندسة الميكروسيرفيسات بلغة Swift - من اختيار الأدوات إلى النشر في بيئة الإنتاج.

\n\n

1. لماذا Swift للميكروسيرفيسات؟

\n\n

تتطلب هندسة الميكروسيرفيسات أداءً عاليًا وأمانًا وسهولة في الصيانة. يوفر Swift كل ذلك:

\n\n
    \n
  • الأداء - الكود المترجم بلغة Swift يمكن مقارنته من حيث السرعة مع C++ و Rust.
  • \n
  • أمان الأنواع - الحد الأدنى من أخطاء وقت التشغيل بفضل نظام الأنواع الصارم.
  • \n
  • بناء جملة حديث - البروتوكولات و async/await و Codable تبسط التطوير.
  • \n
  • التعدد المنصات - كود واحد لـ macOS و Linux والبيئات السحابية.
  • \n
\n\n

إطار العمل الرئيسي لتطوير الخوادم بلغة Swift هو Vapor. يوفر موجهًا قويًا، ودعم WebSocket، و ORM (Fluent)، والتكامل مع Docker.

\n\n

2. هندسة الميكروسيرفيس بلغة Swift

\n\n

لننظر إلى هندسة نموذجية لميكروسيرفيس مسؤول عن إدارة المستخدمين. سيتضمن:

\n\n

2.1 نموذج البيانات

\n
import 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\n

2.2 المتحكم مع async/await

\n
import 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\n

2.3 تسجيل المسارات والترحيلات

\n
import 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                

المدونات

توصيات الكتب