تفاصيل العمل

## نظام تجارة إلكترونية قائم على الـ 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

بطاقة العمل