Skip to content

Ratila1/deliveryService

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

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages