E-Commerce Microservices
Expert Project โ gRPC, MassTransit, Saga Pattern, Docker
๐ง Project Overview
Build a distributed e-commerce system with three microservices communicating via gRPC (sync) and MassTransit/RabbitMQ (async). Practice the saga pattern for distributed transactions.
๐ฏ Requirements
- โข Product Service: CRUD + gRPC for inter-service queries
- โข Order Service: Create orders, validate products via gRPC
- โข Inventory Service: Reserve stock on order creation via messaging
- โข Event-driven saga: OrderCreated โ StockReserved โ OrderConfirmed
- โข Compensating events for failures (StockReservationFailed โ OrderCancelled)
- โข Docker Compose for all services + RabbitMQ
Step 1: Product Service (gRPC + REST)
Product Service โ Minimal API + gRPC
Expose products via REST for clients and gRPC for inter-service calls.
// ProductService/Program.cs โ Minimal API
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<ProductDbContext>(o =>
o.UseNpgsql(builder.Configuration.GetConnectionString("Products")));
builder.Services.AddGrpc();
var app = builder.Build();
app.MapGrpcService<ProductGrpcService>();
// Minimal API endpoints for REST clients
app.MapGet("/api/products", async (ProductDbContext db) =>
await db.Products.Where(p => p.IsActive).ToListAsync());
app.MapGet("/api/pr
...Step 2: Order Service
Order Service โ gRPC Client + Event Publishing
Validate products via gRPC and publish OrderCreated events.
// OrderService/Handlers/CreateOrderHandler.cs
using MassTransit;
public class CreateOrderHandler
{
private readonly OrderDbContext _db;
private readonly ProductService.ProductServiceClient _products;
private readonly IPublishEndpoint _publisher;
public CreateOrderHandler(OrderDbContext db,
ProductService.ProductServiceClient products,
IPublishEndpoint publisher)
{
_db = db;
_products = products;
_publisher = publisher;
}
pub
...Step 3: Inventory Consumer (Saga)
Inventory Consumer โ Stock Reservation Saga
Reserve stock atomically and publish success/failure events.
// InventoryService/Consumers/OrderCreatedConsumer.cs
using MassTransit;
public class OrderCreatedConsumer : IConsumer<OrderCreatedEvent>
{
private readonly InventoryDbContext _db;
private readonly ILogger<OrderCreatedConsumer> _logger;
private readonly IPublishEndpoint _publisher;
public OrderCreatedConsumer(InventoryDbContext db,
ILogger<OrderCreatedConsumer> logger,
IPublishEndpoint publisher)
{
_db = db; _logger = logger; _publisher = publisher;
...Challenge Complete Checklist
- โ All three services run independently
- โ Product queries work via both REST and gRPC
- โ Order creation triggers stock reservation via messaging
- โ Failed reservations trigger compensating events
- โ Docker Compose starts all services + RabbitMQ