انتقل إلى المحتوى الرئيسي

الوحدة 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اكتشاف الخدمة - Eureka1 ساعةخادم/عميل Eureka، موازنة التحميل
3التكوين المركزي1 ساعةSpring Cloud Config، Git backend، التحديث
4API Gateway1 ساعة و15 دقيقةSpring Cloud Gateway، المسارات، الفلاتر
5الاتصال بين الخدمات1 ساعة و30 دقيقةFeign، Resilience4j، Circuit Breaker

الأعمال التطبيقية​

#العمل التطبيقيالمدةالوصف
1خادم Eureka والعملاء1 ساعة و30 دقيقةإنشاء سجل الخدمات
2خادم التكوين1 ساعةالتكوين المركزي Git
3API Gateway1 ساعة و30 دقيقةGateway مع التوجيه والفلاتر
4Feign + Resilience4j2 ساعةالاتصال المرن

المدة الإجمالية المقدرة: ~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إدارة المستخدمين8081PostgreSQL
product-serviceكتالوج المنتجات8082PostgreSQL
order-serviceإدارة الطلبات8083PostgreSQL
inventory-serviceمخزون المنتجات8084PostgreSQL
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 BootSpring CloudJava
3.2.x2023.0.x (Leyton)17+
3.1.x2022.0.x (Kilburn)17+
3.0.x2022.0.x (Kilburn)17+

⚠️ متى تستخدم الخدمات المصغرة؟​

✅ أسباب جيدة​

  • تطبيق كبير مع فرق متعددة
  • حاجة إلى توسع مختلف لكل مكون
  • مجالات عمل محددة جيدًا (Bounded Contexts)
  • حاجة إلى المرونة (عزل الأعطال)
  • عمليات نشر متكررة ومستقلة

❌ أسباب سيئة​

  • "إنها الموضة"
  • مشروع صغير / فريق صغير
  • MVP / نموذج أولي
  • فريق بدون خبرة DevOps
  • بنية تحتية محدودة

💡 القاعدة الذهبية​

"إذا لم تكن لديك مشاكل البنية الأحادية، فلا تحتاج إلى الخدمات المصغرة."

— Martin Fowler


🗺️ تقدم الوحدة​


🚀 جاهز للبدء؟​

هذه الوحدة متقدمة وتتطلب إتقانًا جيدًا للوحدات السابقة. إذا كنت جاهزًا:

  1. قم بتثبيت Docker (ضروري لهذه الوحدة)
  2. تأكد من أن لديك 16GB+ من الذاكرة العشوائية (عدة خدمات)
  3. حضر IDE بدعم Spring (يوصى بـ IntelliJ)

ابدأ الفصل 1: مقدمة في الخدمات المصغرة →


العودة إلى الصفحة الرئيسية