ميكروسيرفيسات جافا: لا تخف، إنها أسهل مما تبدو
\n\nهل سبق لك أن نظرت إلى تطبيق متجانس (Monolithic) وفكرت: "ليتني أستطيع تقسيم هذا إلى أجزاء، حتى لا أخاف من أن تغييرًا واحدًا سيكسر كل شيء"؟ تهانينا — لقد نضجت للميكروسيرفيسات. في عالم جافا، أصبح هذا الموضوع محاطًا بأساطير حول التعقيد الهائل وكومة من التقنيات. في الحقيقة، يمكنك البدء بفئتين وملف واحد application.yml.
في هذه المقالة، لن نبني سفينة فضائية. سنكتب ميكروسيرفيسين بسيطين يتحدثان مع بعضهما عبر HTTP، وسنفهم من أين نبدأ حقًا. لا سحر — فقط جافا وSpring Boot والمنطق السليم.
\n\nما هو الميكروسيرفيس (ببساطة)
\n\nتخيل مطعمًا. التطبيق المتجانس (Monolith) هو عندما يقوم طباخ واحد بكل شيء: يطبخ الحساء، ويشوي الستيك، ويغسل الأطباق. الميكروسيرفيسات هي فريق: طباخ واحد مسؤول فقط عن الحساء، والثاني عن اللحوم، والثالث عن الحلويات. كل منهم يعمل بشكل مستقل، لكنهم معًا يصنعون قائمة طعام مشتركة.
\n\nفي جافا، الميكروسيرفيس هو تطبيق مستقل مسؤول عن وظيفة عمل واحدة (مثل "إدارة المستخدمين" أو "معالجة الطلبات"). لديه قاعدة بيانات خاصة به، وكود خاص به، ويتواصل مع الخدمات الأخرى عبر الشبكة (عادةً عبر HTTP/REST أو عبر وسطاء الرسائل).
\n\nمن أين تبدأ: أدوات المحترف
\n\nللمشروع الأول، ستحتاج فقط إلى ثلاثة أشياء:
\n\n- \n
- Java 17+ — إصدار حديث مع ميزات مفيدة (records, sealed classes). \n
- Spring Boot 3.x — الإطار الأكثر شيوعًا للميكروسيرفيسات بلغة جافا. يتولى 80% من المهام الروتينية. \n
- Maven أو Gradle — للبناء. Maven أسهل للبدء، Gradle أسرع. \n
بالإضافة، عندما تريد التعقيد:
\n- \n
- Docker — لتغليف الخدمة في حاوية. \n
- Spring Cloud — لاكتشاف الخدمات (Service Discovery) وتوزيع الأحمال. \n
- PostgreSQL/H2 — قاعدة بيانات حسب الاختيار. \n
نصيحة: لا تحاول تعلم Kubernetes وKafka فورًا. ابدأ بالتواصل البسيط عبر REST.
\n\nنكتب أول ميكروسيرفيس: خدمة المستخدمين
\n\nلننشئ ميكروسيرفيسًا بسيطًا يمكنه إرجاع معلومات عن المستخدمين. استخدم Spring Initializr (start.spring.io) أو أنشئ المشروع يدويًا.
\n\nأضف التبعيات في pom.xml:
<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-web</artifactId>\n</dependency>\n\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-data-jpa</artifactId>\n</dependency>\n\n<dependency>\n <groupId>com.h2database</groupId>\n <artifactId>h2</artifactId>\n <scope>runtime</scope>\n</dependency>\n\nالآن لنكتب نموذج المستخدم:
\n\nimport jakarta.persistence.*;\n\n@Entity\n@Table(name = "users")\npublic class User {\n @Id\n @GeneratedValue(strategy = GenerationType.IDENTITY)\n private Long id;\n private String name;\n private String email;\n\n // المنشئات، والدوال الجالبة، والدوال الضابطة (يمكن استخدام Lombok)\n public User() {}\n\n public User(String name, String email) {\n this.name = name;\n this.email = email;\n }\n\n // الدوال الجالبة والدوال الضابطة\n}\n\nالمستودع (وصول مبسط للبيانات):
\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n}\n\nووحدة التحكم — نقطة نهاية REST:
\n\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n@RestController\n@RequestMapping("/api/users")\npublic class UserController {\n\n private