Skip to content

Repository files navigation

DeliveryService β€” ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΠ½Π°Ρ систСма доставки Π΅Π΄Ρ‹

DeliveryService β€” Food Delivery Microservice System


RU β€” Русский

ОписаниС

Π£Ρ‡Π΅Π±Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ микросСрвисной систСмы доставки Π΅Π΄Ρ‹ Π½Π° Π±Π°Π·Π΅ Spring Boot. Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π°ΠΊΠ°Π·Π°: ΠΎΡ‚ создания Π΄ΠΎ назначСния ΠΊΡƒΡ€ΡŒΠ΅Ρ€Π°. БСрвисы Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ синхронно Ρ‡Π΅Ρ€Π΅Π· HTTP ΠΈ асинхронно Ρ‡Π΅Ρ€Π΅Π· Apache Kafka.

АрхитСктура

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         Client                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚ HTTP
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           order-service :8080          β”‚
β”‚  - Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π·ΠΎΠ²                    β”‚
β”‚  - Π˜Π½ΠΈΡ†ΠΈΠ°Ρ†ΠΈΡ ΠΎΠΏΠ»Π°Ρ‚Ρ‹                    β”‚
β”‚  - ОбновлСниС статуса Π·Π°ΠΊΠ°Π·Π°           β”‚
β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
    β”‚ HTTP         β”‚ Kafka         β”‚ Kafka
    β”‚              β”‚ orders.events β”‚ delivery.events
    β–Ό              β–Ό               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  payment  β”‚  β”‚        delivery-service :8082     β”‚
β”‚  service  β”‚  β”‚  - НазначСниС ΠΊΡƒΡ€ΡŒΠ΅Ρ€Π°             β”‚
β”‚  :8081    β”‚  β”‚  - ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° события ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

БСрвисы

БСрвис ΠŸΠΎΡ€Ρ‚ НазначСниС
order-service 8080 Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π·Π°ΠΌΠΈ, оркСстрация процСсса
payment-service 8081 ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ
delivery-service 8082 НазначСниС ΠΊΡƒΡ€ΡŒΠ΅Ρ€Π°, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° событий ΠΎ доставкС

Π‘Ρ‚Π΅ΠΊ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ

  • Java 17
  • Spring Boot 3.5
  • Spring Data JPA β€” Ρ€Π°Π±ΠΎΡ‚Π° с Π‘Π”
  • Spring Kafka β€” асинхронный ΠΎΠ±ΠΌΠ΅Π½ событиями
  • Spring Web / HttpExchange β€” синхронноС мСТсСрвисноС взаимодСйствиС
  • PostgreSQL 16 β€” Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…
  • Apache Kafka (Confluent 8.1) β€” Π±Ρ€ΠΎΠΊΠ΅Ρ€ сообщСний
  • Lombok / MapStruct β€” ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Π±ΠΎΠΉΠ»Π΅Ρ€ΠΏΠ»Π΅ΠΉΡ‚Π°
  • Docker Compose β€” локальная инфраструктура
  • Gradle (Kotlin DSL) β€” сборка, ΠΌΠ½ΠΎΠ³ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

deliveryService/
β”œβ”€β”€ common-libs/          # ΠžΠ±Ρ‰ΠΈΠ΅ DTO ΠΈ Kafka-события (OrderPaidEvent, DeliveryAssignedEvent ΠΈ Π΄Ρ€.)
β”œβ”€β”€ order-service/        # БСрвис Π·Π°ΠΊΠ°Π·ΠΎΠ²
β”œβ”€β”€ payment-service/      # БСрвис ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ
β”œβ”€β”€ delivery-service/     # БСрвис доставки
β”œβ”€β”€ docker-compose.yaml   # PostgreSQL + Kafka
└── settings.gradle.kts   # ΠœΠ½ΠΎΠ³ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ сборка

Kafka-Ρ‚ΠΎΠΏΠΈΠΊΠΈ ΠΈ события

Π’ΠΎΠΏΠΈΠΊ ΠŸΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€ ΠšΠΎΠ½ΡΡŽΠΌΠ΅Ρ€ Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅
orders.events order-service delivery-service OrderPaidEvent
delivery.events delivery-service order-service DeliveryAssignedEvent

ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π·Π°ΠΊΠ°Π·Π°

1. POST /api/orders          β€” созданиС Π·Π°ΠΊΠ°Π·Π° (статус: PENDING_PAYMENT)
2. POST /api/orders/{id}/pay β€” ΠΎΠΏΠ»Π°Ρ‚Π° Π·Π°ΠΊΠ°Π·Π° Ρ‡Π΅Ρ€Π΅Π· payment-service
3.   order-service β†’ Kafka (orders.events) β†’ delivery-service
4.   delivery-service Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ случайного ΠΊΡƒΡ€ΡŒΠ΅Ρ€Π° ΠΈ ETA
5.   delivery-service β†’ Kafka (delivery.events) β†’ order-service
6.   order-service обновляСт Π·Π°ΠΊΠ°Π· (статус: DELIVERY_ASSIGNED)
7. GET /api/orders/{id}      β€” ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ статуса Π·Π°ΠΊΠ°Π·Π°

Бтатусы Π·Π°ΠΊΠ°Π·Π°

Бтатус ОписаниС
PENDING_PAYMENT Π—Π°ΠΊΠ°Π· создан, ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΠΏΠ»Π°Ρ‚Ρ‹
PAID ΠžΠΏΠ»Π°Ρ‚Π° ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ
PAYMENT_FAILED ΠžΠΏΠ»Π°Ρ‚Π° ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½Π°
DELIVERY_ASSIGNED ΠšΡƒΡ€ΡŒΠ΅Ρ€ Π½Π°Π·Π½Π°Ρ‡Π΅Π½
DELIVERED Π—Π°ΠΊΠ°Π· доставлСн

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠΏΠ»Π°Ρ‚Ρ‹

ΠœΠ΅Ρ‚ΠΎΠ΄ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
CARD ВсСгда ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ
YANDEX_SPLIT ВсСгда ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ
QR ВсСгда отклоняСтся

Быстрый старт

ВрСбования

  • JDK 17+
  • Docker Desktop
  • Gradle (ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ./gradlew)

1. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ инфраструктуру

docker compose up -d

2. Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

./gradlew build

3. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвисы

Запускай ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСрвис ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ· корня ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Ρ‡Π΅Ρ€Π΅Π· IntelliJ IDEA ΠΈΠ»ΠΈ CLI):

./gradlew :order-service:bootRun
./gradlew :payment-service:bootRun
./gradlew :delivery-service:bootRun

REST API

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°ΠΊΠ°Π·

POST http://localhost:8080/api/orders
Content-Type: application/json

{
  "customerId": 1,
  "address": "ΡƒΠ». ΠŸΡƒΡˆΠΊΠΈΠ½Π°, Π΄. 10",
  "items": [
    { "itemId": 101, "quantity": 2, "name": "Π‘ΡƒΡ€Π³Π΅Ρ€" },
    { "itemId": 102, "quantity": 1, "name": "ΠšΠ°Ρ€Ρ‚ΠΎΡˆΠΊΠ° Ρ„Ρ€ΠΈ" }
  ]
}

ΠžΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π°ΠΊΠ°Π·

POST http://localhost:8080/api/orders/{id}/pay
Content-Type: application/json

{
  "paymentMethod": "CARD"
}

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π°ΠΊΠ°Π·

GET http://localhost:8080/api/orders/{id}

Бброс Π΄Π°Π½Π½Ρ‹Ρ… (Π±Π΅Π· пСрСзапуска ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²)

PostgreSQL:

docker exec -it <postgres-container> psql -U postgres -d orders -c \
  "DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres;"

Kafka:

docker exec -it <kafka-container> kafka-topics --bootstrap-server localhost:9092 --delete --topic orders.events
docker exec -it <kafka-container> kafka-topics --bootstrap-server localhost:9092 --delete --topic delivery.events
docker exec -it <kafka-container> kafka-topics --bootstrap-server localhost:9092 --create --topic orders.events --partitions 1 --replication-factor 1
docker exec -it <kafka-container> kafka-topics --bootstrap-server localhost:9092 --create --topic delivery.events --partitions 1 --replication-factor 1

EN β€” English

Overview

A study project implementing a microservice-based food delivery system built with Spring Boot. It covers the full order lifecycle: from creation to courier assignment. Services communicate synchronously over HTTP and asynchronously through Apache Kafka.

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         Client                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚ HTTP
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           order-service :8080          β”‚
β”‚  - Create orders                       β”‚
β”‚  - Initiate payments                   β”‚
β”‚  - Update order status                 β”‚
β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
    β”‚ HTTP         β”‚ Kafka         β”‚ Kafka
    β”‚              β”‚ orders.events β”‚ delivery.events
    β–Ό              β–Ό               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  payment  β”‚  β”‚        delivery-service :8082     β”‚
β”‚  service  β”‚  β”‚  - Assign courier                 β”‚
β”‚  :8081    β”‚  β”‚  - Publish delivery event         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Services

Service Port Responsibility
order-service 8080 Order management, process orchestration
payment-service 8081 Payment processing
delivery-service 8082 Courier assignment, delivery event publishing

Tech Stack

  • Java 17
  • Spring Boot 3.5
  • Spring Data JPA β€” database access
  • Spring Kafka β€” asynchronous event-driven communication
  • Spring Web / HttpExchange β€” synchronous inter-service HTTP calls
  • PostgreSQL 16 β€” persistent storage
  • Apache Kafka (Confluent 8.1) β€” message broker
  • Lombok / MapStruct β€” boilerplate reduction
  • Docker Compose β€” local infrastructure
  • Gradle (Kotlin DSL) β€” build system, multi-module project

Project Structure

deliveryService/
β”œβ”€β”€ common-libs/          # Shared DTOs and Kafka events (OrderPaidEvent, DeliveryAssignedEvent, etc.)
β”œβ”€β”€ order-service/        # Order service
β”œβ”€β”€ payment-service/      # Payment service
β”œβ”€β”€ delivery-service/     # Delivery service
β”œβ”€β”€ docker-compose.yaml   # PostgreSQL + Kafka
└── settings.gradle.kts   # Multi-module build definition

Kafka Topics & Events

Topic Producer Consumer Event
orders.events order-service delivery-service OrderPaidEvent
delivery.events delivery-service order-service DeliveryAssignedEvent

Order Lifecycle

1. POST /api/orders          β€” create order (status: PENDING_PAYMENT)
2. POST /api/orders/{id}/pay β€” pay via payment-service over HTTP
3.   order-service β†’ Kafka (orders.events) β†’ delivery-service
4.   delivery-service assigns a random courier and ETA
5.   delivery-service β†’ Kafka (delivery.events) β†’ order-service
6.   order-service updates the order (status: DELIVERY_ASSIGNED)
7. GET /api/orders/{id}      β€” fetch final order state

Order Statuses

Status Description
PENDING_PAYMENT Order created, awaiting payment
PAID Payment successful
PAYMENT_FAILED Payment declined
DELIVERY_ASSIGNED Courier assigned
DELIVERED Order delivered

Payment Methods

Method Result
CARD Always succeeds
YANDEX_SPLIT Always succeeds
QR Always fails

Quick Start

Prerequisites

  • JDK 17+
  • Docker Desktop
  • Gradle (or use the ./gradlew wrapper)

1. Start infrastructure

docker compose up -d

2. Build the project

./gradlew build

3. Run services

Start each service separately from the project root (via IntelliJ IDEA or CLI):

./gradlew :order-service:bootRun
./gradlew :payment-service:bootRun
./gradlew :delivery-service:bootRun

REST API

Create Order

POST http://localhost:8080/api/orders
Content-Type: application/json

{
  "customerId": 1,
  "address": "123 Main St",
  "items": [
    { "itemId": 101, "quantity": 2, "name": "Burger" },
    { "itemId": 102, "quantity": 1, "name": "French Fries" }
  ]
}

Pay for Order

POST http://localhost:8080/api/orders/{id}/pay
Content-Type: application/json

{
  "paymentMethod": "CARD"
}

Get Order

GET http://localhost:8080/api/orders/{id}

Resetting Data (without restarting containers)

PostgreSQL:

docker exec -it <postgres-container> psql -U postgres -d orders -c \
  "DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres;"

Kafka:

docker exec -it <kafka-container> kafka-topics --bootstrap-server localhost:9092 --delete --topic orders.events
docker exec -it <kafka-container> kafka-topics --bootstrap-server localhost:9092 --delete --topic delivery.events
docker exec -it <kafka-container> kafka-topics --bootstrap-server localhost:9092 --create --topic orders.events --partitions 1 --replication-factor 1
docker exec -it <kafka-container> kafka-topics --bootstrap-server localhost:9092 --create --topic delivery.events --partitions 1 --replication-factor 1

About

πŸ• Microservices-based Food Delivery System. Built with Spring Boot 3.5, Kafka (EDA), PostgreSQL, and Docker. Features sync HTTP calls and async event processing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages