## نظام تجارة إلكترونية قائم على الـ Microservices باستخدام .NET
مشروع متكامل يحاكي بنية أنظمة التجارة الإلكترونية الحديثة، تم تصميمه باستخدام **Microservices Architecture** مع فصل كل نطاق وظيفي إلى خدمة مستقلة، بما يتيح تطوير الخدمات وتوسعتها وإدارتها بشكل مستقل.
يتكون النظام من مجموعة من الخدمات المتخصصة في **المنتجات (Catalog)، سلة المشتريات (Basket)، الخصومات (Discount)، والطلبات (Ordering)**، مع استخدام قواعد بيانات مختلفة وفقًا لطبيعة كل خدمة، بالإضافة إلى تطبيق **API Gateway** لإدارة وتوجيه الطلبات.
### المكونات الرئيسية للمشروع
**1. خدمة المنتجات – Catalog Microservice**
مسؤولة عن إدارة المنتجات والبيانات الخاصة بها، وتم تطويرها باستخدام:
* ASP.NET Core Minimal APIs و .NET 8 و C# 12.
* تطبيق **Vertical Slice Architecture** لتنظيم النظام حسب الـ Features.
* تطبيق **CQRS** باستخدام MediatR لفصل عمليات القراءة والكتابة.
* FluentValidation للتحقق من صحة البيانات من خلال MediatR Pipeline Behaviors.
* استخدام **Marten** كـ Document Database Layer فوق PostgreSQL.
* استخدام Carter لتنظيم وتعريف Minimal API Endpoints.
* تطبيق Logging و Global Exception Handling و Health Checks.
**2. خدمة سلة المشتريات – Basket Microservice**
مسؤولة عن إدارة سلة المشتريات الخاصة بالمستخدم، وتشمل:
* ASP.NET Core Web API.
* تطبيق مبادئ REST API.
* استخدام **Redis** كـ Distributed Cache لتخزين بيانات السلة.
* تطبيق Cache-Aside Pattern.
* استخدام Proxy و Decorator Patterns.
* التواصل المتزامن مع خدمة الخصومات من خلال **gRPC** للحصول على السعر النهائي للمنتجات.
* نشر حدث **Basket Checkout** بشكل غير متزامن باستخدام MassTransit و RabbitMQ.
**3. خدمة الخصومات – Discount Microservice**
خدمة مستقلة مسؤولة عن إدارة الخصومات وحسابها، وتم تنفيذها باستخدام:
* ASP.NET Core gRPC Server.
* **gRPC** للتواصل عالي الأداء بين الخدمات.
* Protocol Buffers (Protobuf) لتعريف الرسائل والخدمات.
* Entity Framework Core لإدارة الوصول إلى البيانات.
* SQLite كقاعدة بيانات للخدمة.
* Containerization باستخدام Docker.
**4. خدمة الطلبات – Ordering Microservice**
مسؤولة عن إنشاء وإدارة الطلبات، وتم تصميمها وفق مبادئ:
* **Domain-Driven Design (DDD)**.
* **Clean Architecture**.
* **CQRS** باستخدام MediatR.
* FluentValidation للتحقق من صحة البيانات.
* Mapster لتحويل الـ DTOs والـ Domain Models.
* استقبال أحداث Basket Checkout من RabbitMQ بشكل غير متزامن.
* استخدام MassTransit للتعامل مع RabbitMQ.
* SQL Server و Entity Framework Core لتخزين بيانات الطلبات.
* تطبيق Database Auto-Migration عند تشغيل الخدمة.
### التواصل بين الخدمات
تم تطبيق أكثر من أسلوب للتواصل بين الـ Microservices حسب طبيعة العملية:
**التواصل المتزامن (Synchronous Communication)**
يتم استخدام **gRPC** عندما تحتاج خدمة إلى استجابة مباشرة من خدمة أخرى، مثل:
```text
Basket Service
│
│ gRPC
▼
Discount Service
│
▼
Calculate Discount
│
▼
Return Final Price
```
**التواصل غير المتزامن (Asynchronous Communication)**
يتم استخدام **RabbitMQ** للأحداث التي لا تتطلب استجابة فورية.
على سبيل المثال، عند إتمام عملية Checkout:
```text
Basket Service
│
│ BasketCheckout Event
▼
RabbitMQ
│
▼
Ordering Service
│
▼
Create Order
```
وتم استخدام **MassTransit** لتبسيط التعامل مع RabbitMQ وتطبيق Publish/Subscribe Messaging Pattern.
كما تم إنشاء مكتبة مشتركة باسم **EventBus.Messages** لتعريف الـ Events والـ Contracts المستخدمة بين الخدمات.
### API Gateway
تم استخدام **YARP (Yet Another Reverse Proxy)** كـ API Gateway أمام الخدمات المختلفة.
بدلًا من أن يتعامل العميل مباشرة مع كل Microservice:
```text
Client
│
▼
YARP API Gateway
│
├──► Catalog
├──► Basket
├──► Discount
└──► Ordering
```
ويقوم الـ Gateway أيضًا بـ:
* Routing.
* إدارة الـ Routes والـ Clusters.
* Path Transformation.
* توجيه الطلبات إلى الخدمات المناسبة.
* تطبيق **Rate Limiting** باستخدام Fixed Window Limiter.
### قواعد البيانات والبنية التحتية
تم استخدام أكثر من نوع من قواعد البيانات، بحيث تختار كل خدمة قاعدة البيانات الأنسب لطبيعة بياناتها:
```text
Catalog → PostgreSQL + Marten
Basket → Redis
Discount → SQLite
Ordering → SQL Server
Messaging → RabbitMQ
API Gateway → YARP
```
وهذا يعكس مفهوم **Database-per-Service** المستخدم في تصميم الـ Microservices.
### Docker و Containerization
تم تشغيل الخدمات وقواعد البيانات والبنية التحتية باستخدام **Docker Compose**، مما يسمح بتشغيل النظام بالكامل كبيئة متكاملة.
يشمل ذلك:
* Container لكل Microservice.
* Container لقواعد البيانات.
* Container لـ Redis.
* Container لـ RabbitMQ.
* إدارة Environment Variables.
* تشغيل النظام بالكامل من خلال Docker Compose.
### واجهة المستخدم
يتضمن المشروع Web UI مبنيًا باستخدام **ASP.NET Core Razor Pages و Bootstrap**، ويقوم بالتواصل مع النظام من خلال **YARP API Gateway** باستخدام Refit و HttpClientFactory.
وبذلك يمكن اختبار دورة الشراء كاملة:
```text
Browse Products
↓
Add to Basket
↓
Apply Discount
↓
Checkout
↓
BasketCheckout Event
↓
RabbitMQ
↓
Ordering Service
↓
Create Order
```
### الهدف من المشروع
الهدف الأساسي من المشروع هو تطبيق المفاهيم والممارسات المستخدمة في بناء أنظمة **Enterprise-Grade Microservices** باستخدام .NET، مع التركيز على:
* Scalability
* Separation of Concerns
* Loose Coupling
* Asynchronous Communication
* Distributed Caching
* API Gateway
* Event-Driven Architecture
* Clean Architecture
* DDD
* CQRS
* Containerization
* Fault Handling & Observability