Skip to content

Conversation

@impatient0
Copy link
Owner

@impatient0 impatient0 commented Aug 15, 2025

Этот Pull Request завершает работу над e-commerce частью проекта, добавляя сервисы order, payment и delivery, а также настраивая API Gateway.

Что было сделано:

  1. Реализованы новые сервисы: order, payment, delivery. Каждый из них работает со своей выделенной БД, получает конфигурацию из Config Server и регистрируется в Eureka.

  2. Оркестратор (order-сервис): Основной метод createNewOrder координирует взаимодействие других сервисов, последовательно обращаясь к warehouse, delivery и payment для резервации товаров, планирования доставки и создания платежа.

  3. Взаимодействие через Feign: Вся коммуникация между сервисами построена на декларативных Feign-клиентах, что делает код чистым и читаемым.

  4. API Gateway: Настроен шлюз (api-gateway), который теперь является единой точкой входа для всех сервисов commerce.

Архитектурные решения и компромиссы:

В процессе работы я столкнулся с несколькими сложностями, связанными со спецификацией API.

  • API контракты (order.json): Изначальная спецификация order сервиса была немного противоречивой, смешивая синхронные и асинхронные (callback) подходы. Чтобы построить логичный и последовательный процесс создания заказа, я постарался приближённо реализовать синхронный подход в создании заказа с дальнейшей асинхронной обработкой оплаты и доставки. В связи с этим некоторые эндпойнты из спецификации оказались избыточными и были "заглушены" с ответом 501 Not Implemented.

  • Проблема "фантомных" бронирований: Для реализации полноценного синхронного SAGA-паттерна с компенсирующими транзакциями в спецификации API не хватало эндпойнтов (например, для высвобождения бронирования). В связи с этим в текущей реализации есть риск, например, создания бронированиий товаров, которые не привязаны к существующему заказу в случае, если процесс создания заказа падает уже после создания бронирования. На мой взгляд, оптимальным решением был бы переход на асинхронную, событийно-ориентированную архитектуру с компенсирующими транзакциями, но это выходило далеко за рамки текущего ТЗ.

В целом, я постарался сделать систему максимально надежной в рамках того, как мне удалось интерпретировать предложенную архитектуру.

@impatient0 impatient0 changed the title 9 gateway microservices feat: Завершение e-commerce платформы (Order, Payment, Delivery) Aug 18, 2025
@impatient0 impatient0 marked this pull request as ready for review August 18, 2025 03:31
Copy link

@kesch9 kesch9 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Несколько комментариев

.orElseThrow(() -> new DeliveryNotFoundException(orderDto.getOrderId()));

BigDecimal baseCost = new BigDecimal("5.0");
BigDecimal cost = new BigDecimal("5.0");
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как вариант, можно вынести в настройки все коэффициент


public interface JpaPaymentRepositoryInterface extends JpaRepository<Payment, UUID> {

Optional<Payment> findByOrderId(UUID orderId);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Метод не используется можно удалить


Optional<Payment> findById(UUID paymentId);

Optional<Payment> findByOrderId(UUID orderId);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Также метод не используется

public interface PaymentClient {

@PostMapping
PaymentDto createPayment(@RequestBody OrderDto order);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В Api можно добавить @Valid @NotNull для валидации

import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")
public interface AddressApiMapper {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Выносить в api mapper думаю излишни, они используется только в одном сервисе, там их и реализовать, в общий модуль не нужно

Copy link

@kesch9 kesch9 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve

@impatient0 impatient0 merged commit d77bd6d into main Aug 19, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants