الوحدة 13: Spring Cloud والخدمات المصغرة
🎯 أهداف الوحدة
في نهاية هذه الوحدة، ستكون قادرًا على:
- ✅ فهم بنية الخدمات المصغرة مقابل البنية الأحادية
- ✅ إعداد اكتشاف الخدمة باستخدام Eureka
- ✅ مركزية التكوين باستخدام Spring Cloud Config
- ✅ إنشاء API Gateway باستخدام Spring Cloud Gateway
- ✅ تنفيذ الاتصال بين الخدمات باستخدام Feign
- ✅ تطبيق أنماط المرونة باستخدام Resilience4j
- ✅ فهم الأنماط: Circuit Breaker، Retry، Rate Limiter
📋 المتطلبات الأساسية
قبل أن تبدأ هذه الوحدة، تأكد من إتقانك لـ:
- ✅ الوحدات 1-6: أساسيات Spring Boot وSpring Data JPA
- ✅ الوحدة 7: المعاملات والتكوين
- ✅ الوحدة 8: Spring Security (لتأمين الخدمات)
- ✅ الوحدة 12: Docker والنشر (لتنسيق الخدمات)
- ✅ مفاهيم REST API
- ✅ Docker وDocker Compose (ضروري!)
🏗️ بنية الوحدة
📚 خطة الوحدة
الفصول النظرية
| # | الفصل | المدة | الوصف |
|---|---|---|---|
| 1 | مقدمة في الخدمات المصغرة | 45 دقيقة | بنية أحادية مقابل خدمات مصغرة، الأنماط، تطبيق 12-Factor |
| 2 | اكتشاف الخدمة - Eureka | 1 ساعة | خادم/عميل Eureka، موازنة التحميل |
| 3 | التكوين المركزي | 1 ساعة | Spring Cloud Config، Git backend، التحديث |
| 4 | API Gateway | 1 ساعة و15 دقيقة | Spring Cloud Gateway، المسارات، الفلاتر |
| 5 | الاتصال بين الخدمات | 1 ساعة و30 دقيقة | Feign، Resilience4j، Circuit Breaker |
الأعمال التطبيقية
| # | العمل التطبيقي | المدة | الوصف |
|---|---|---|---|
| 1 | خادم Eureka والعملاء | 1 ساعة و30 دقيقة | إنشاء سجل الخدمات |
| 2 | خادم التكوين | 1 ساعة | التكوين المركزي Git |
| 3 | API Gateway | 1 ساعة و30 دقيقة | Gateway مع التوجيه والفلاتر |
| 4 | Feign + Resilience4j | 2 ساعة | الاتصال المرن |
المدة الإجمالية المقدرة: ~12 ساعة
🎬 قبل / بعد هذه الوحدة
❌ قبل (بنية أحادية)
┌─────────────────────────────────────────────┐
│ تطبيق أحادي │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ المستخدمون │ │المنتجات │ │ الطلبات │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ قاعدة بيانات واحدة │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────────┘
المشاكل:
- خطأ واحد = تعطل التطبيق بالكامل
- التوسع: كل شيء أو لا شيء
- النشر: إعادة نشر كل شيء
- التقنيات: مجموعة واحدة فقط
- الفرق: تعارضات الدمج
✅ بعد (بنية الخدمات المصغرة)
┌──────────┐ ┌──────────┐ ┌──────────┐
│ المستخدمون │ │ المنتجات │ │ الطلبات │
│ الخدمة │ │ الخدمة │ │ الخدمة │
│ :8081 │ │ :8082 │ │ :8083 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
│ ┌─────────┴─────────┐ │
└────┤ خادم Eureka ├────┘
│ :8761 │
└─────────┬─────────┘
│
┌─────────┴─────────┐
│ API Gateway │
│ :8080 │
└───────────────────┘
المزايا:
- عزل الأعطال
- توسع مستقل
- نشر مستمر
- متعدد اللغات (Java، Node، Python...)
- فرق مستقلة
🧩 مكونات Spring Cloud
🏢 حالة استخدام: خدمات مصغرة للتجارة الإلكترونية
خلال هذه الوحدة، سنقوم ببناء منصة تجارة إلكترونية:
الخدمات التي سيتم إنشاؤها
| الخدمة | المسؤولية | المنفذ | قاعدة البيانات |
|---|---|---|---|
| eureka-server | سجل الخدمات | 8761 | - |
| config-server | التكوين المركزي | 8888 | مستودع Git |
| api-gateway | نقطة دخول واحدة | 8080 | - |
| user-service | إدارة المستخدمين | 8081 | PostgreSQL |
| product-service | كتالوج المنتجات | 8082 | PostgreSQL |
| order-service | إدارة الطلبات | 8083 | PostgreSQL |
| inventory-service | مخزون المنتجات | 8084 | PostgreSQL |
| notification-service | البريد الإلكتروني/الرسائل القصيرة | 8085 | - |
تدفق الطلب
🔑 المفاهيم الرئيسية
1. اكتشاف الخدمة (لماذا؟)
بدون اكتشاف الخدمة:
- عناوين URL ثابتة: http://192.168.1.10:8081
- إذا تحركت الخدمة → كل شيء يتعطل
- موازنة التحميل يدوية
مع Eureka:
- تسجل الخدمات نفسها: "أنا user-service"
- يسأل العملاء: "أين user-service؟"
- يجيب Eureka بجميع الحالات
- موازنة التحميل تلقائية
2. التكوين المركزي (لماذا؟)
بدون خادم التكوين:
- كل خدمة لديها application.properties الخاصة بها
- تغيير كلمة مرور قاعدة البيانات = تعديل 10 ملفات
- إعادة نشر جميع الخدمات
مع خادم التكوين:
- التكوين في Git
- مكان واحد للتعديل
- تحديث بدون إعادة تشغيل
- تشفير الأسرار
3. API Gateway (لماذا؟)
بدون Gateway:
- العميل يعرف جميع الخدمات
- إدارة CORS في كل مكان
- تنفيذ المصادقة في كل مكان
- تحديد المعدل مستحيل
مع Gateway:
- نقطة دخول واحدة
- مصادقة مركزية
- تحديد المعدل
- تسجيل مركزي
- تحويل الطلبات/الاستجابات
4. Circuit Breaker (لماذا؟)
بدون Circuit Breaker:
- الخدمة A تستدعي الخدمة B
- الخدمة B معطلة
- الخدمة A تنتظر... انتهاء المهلة
- فشل متسلسل → كل شيء يتعطل
مع Circuit Breaker:
- يكتشف الإخفاقات
- "يفتح" الدائرة
- يعيد فورا إلى fallback
- "يغلق" عندما تعود B
📦 المكدس التقني
تبعيات Maven (BOM)
<!-- في POM الرئيسي -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
الإصدارات المتوافقة
| Spring Boot | Spring Cloud | Java |
|---|---|---|
| 3.2.x | 2023.0.x (Leyton) | 17+ |
| 3.1.x | 2022.0.x (Kilburn) | 17+ |
| 3.0.x | 2022.0.x (Kilburn) | 17+ |
⚠️ متى تستخدم الخدمات المصغرة؟
✅ أسباب جيدة
- تطبيق كبير مع فرق متعددة
- حاجة إلى توسع مختلف لكل مكون
- مجالات عمل محددة جيدًا (Bounded Contexts)
- حاجة إلى المرونة (عزل الأعطال)
- عمليات نشر متكررة ومستقلة
❌ أسباب سيئة
- "إنها الموضة"
- مشروع صغير / فريق صغير
- MVP / نموذج أولي
- فريق بدون خبرة DevOps
- بنية تحتية محدودة
💡 القاعدة الذهبية
"إذا لم تكن لديك مشاكل البنية الأحادية، فلا تحتاج إلى الخدمات المصغرة."
— Martin Fowler
🗺️ تقدم الوحدة
🚀 جاهز للبدء؟
هذه الوحدة متقدمة وتتطلب إتقانًا جيدًا للوحدات السابقة. إذا كنت جاهزًا:
- قم بتثبيت Docker (ضروري لهذه الوحدة)
- تأكد من أن لديك 16GB+ من الذاكرة العشوائية (عدة خدمات)
- حضر IDE بدعم Spring (يوصى بـ IntelliJ)
ابدأ الفصل 1: مقدمة في الخدمات المصغرة →