Skip to content

Modular e-commerce backend with a GraphQL gateway and gRPC microservices for accounts, products, orders, and recommendations.

License

Notifications You must be signed in to change notification settings

rasadov/EcommerceAPI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

47 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ECOMMERCE MICROSERVICES

This repository hosts a sample e-commerce platform demonstrating a microservices architecture using multiple Go services alongside a Python-based Recommender service. The project showcases:

  • gRPC communication between services
  • Kafka-based event streaming pipeline
  • A unified GraphQL API gateway for clients
  • Elasticsearch integration for product search

πŸ“š Table of Contents


🧭 Overview

The system comprises several microservices:

  • Account (Go): Manages user accounts, authentication, and authorization.
  • Product (Go): CRUD for products; indexes product data in Elasticsearch.
  • Order (Go): Handles order creation and persistence; publishes events to Kafka.
  • Recommender (Python): Consumes Kafka events and builds product recommendations.
  • API Gateway (Go): A GraphQL service exposing a unified API for front-end clients.

The entire ecosystem is containerized using Docker Compose. Datastores include PostgreSQL, Elasticsearch, and Kafka.


πŸ— Architecture Diagram

Below is a high-level overview of the system architecture:

API Design

Communication Overview

  • API Gateway (GraphQL) talks to:

    • Account client β†’ Account server β†’ Postgres
    • Product client β†’ Product server β†’ ElasticSearch
    • Order client β†’ Order server β†’ Postgres + Kafka
      (also communicates with Product service via gRPC)
    • Recommender client β†’ Recommender server (Python) β†’ Postgres (Replica)
  • Event Flow:

    • Order and Product services act as Kafka producers.
    • Recommender service is a Kafka consumer, ingesting order/product events and updating internal state for recommendations.

βš™ Services

πŸ§‘β€πŸ’Ό Account Service (Go)

  • Responsibilities: Register, login, fetch account data, generate JWT tokens.
  • Database: PostgreSQL

πŸ“¦ Product Service (Go)

  • Responsibilities: Product CRUD operations, indexing to Elasticsearch, event publishing to Kafka.
  • Database: Elasticsearch

πŸ›’ Order Service (Go)

  • Responsibilities: Order creation, price calculation, data persistence, Kafka event publishing.
  • Dependencies: Calls product service to retrieve product info.

🧠 Recommender Service (Python)

  • Responsibilities: Kafka consumer that builds recommendations based on product/order events.
  • Tech Stack: Python + gRPC + PostgreSQL (replica of product DB)

πŸšͺ API Gateway (Go)

  • Responsibilities: Unified GraphQL endpoint at /graphql.
  • Implementation: Uses gRPC clients for all microservices and schema stitching.

πŸš€ Getting Started

βœ… Prerequisites

Before running the project, ensure you have the following installed:


πŸ“₯ Clone the Repository

  git clone https://github.com/rasadov/EcommerceAPI.git
  cd ecommercemicroservices

🐳 Run the Stack

To build and start all services using Docker Compose, run:

  docker-compose up --build

This will start:

  • Go microservices (account, order, product, graphql)
  • Python-based recommender service
  • Databases: PostgreSQL, Elasticsearch
  • Kafka + Zookeeper
  • GraphQL gateway

🌐 Access the API

Once everything is running, open your browser to:


πŸ“¬ Usage (GraphQL)

Below are example GraphQL queries and mutations you can test in the GraphQL Playground.


πŸ“ Register a New Account

mutation {
  register(account: {
    name: "Alice"
    email: "[email protected]"
    password: "secret123"
  }) {
    token
  }
}

πŸ” Login

mutation {
  login(account: {
    email: "[email protected]"
    password: "secret123"
  }) {
    token
  }
}

βž• Create a Product

mutation {
  createProduct(product: {
    name: "Camera"
    description: "A digital camera"
    price: 99.99
  }) {
    id
    name
  }
}

πŸ” Query Products

query {
  product(pagination: { skip: 0, take: 10 }) {
    id
    name
    price
  }
}

πŸ›’ Create an Order

mutation {
  createOrder(order: {
    products: [
      { id: "PRODUCT_ID", quantity: 2 }
    ]
  }) {
    id
    totalPrice
    products {
      name
      quantity
    }
  }
}

🀝 Contributing

We welcome contributions! To contribute:

Fork the repository

Create a new branch

Commit and push your changes

Open a Pull Request

πŸ‘€ Author

Rauf Asadov
GitHub: @rasadov
LinkedIn: Rauf Asadov
Email: [email protected]

πŸͺͺ License

This project is licensed under the Apache License 2.0.