Должны ли микросервисы взаимодействовать напрямую друг с другом?

«Должны ли микросервисы взаимодействовать напрямую друг с другом?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, прямое жесткое взаимодействие (например, через HTTP-вызовы, известные друг другу URL) считается антипаттерном в микросервисной архитектуре, так как создает сильную связность и снижает отказоустойчивость.

Правильные подходы к коммуникации:

  1. Асинхронная коммуникация через брокер сообщений (Kafka, RabbitMQ). Сервисы обмениваются событиями, не зная друг о друге.
  2. API Gateway как единая точка входа для внешних клиентов, который маршрутизирует запросы к сервисам.
  3. Event-Driven архитектура, где сервисы публикуют и подписываются на события.

Пример: Прямой вызов (антипаттерн)

// Сервис A (плохая практика)
public class OrderService {
    public void processOrder(Order order) {
        // Прямой вызов создает хрупкую зависимость
        User user = new RestTemplate()
            .getForObject("http://user-service-host:8080/users/" + order.getUserId(),
                           User.class);
    }
}

Проблемы: Если user-service упал, order-service тоже перестанет работать. Изменение API или адреса user-service требует переделки order-service.

Пример: Через брокер сообщений (рекомендуется)

// Сервис A публикует событие
@Service
public class OrderService {
    @Autowired
    private KafkaTemplate<String, OrderCreatedEvent> kafkaTemplate;

    public void createOrder(Order order) {
        // ... сохранение заказа
        kafkaTemplate.send("order-created-topic", new OrderCreatedEvent(order.getId()));
    }
}

// Сервис B независимо подписывается на событие
@Service
public class NotificationService {
    @KafkaListener(topics = "order-created-topic")
    public void handleOrderCreated(OrderCreatedEvent event) {
        // Отправка уведомления о новом заказе
    }
}

Преимущества: Сервисы независимы. Падение одного не ломает другой. Легче масштабировать и изменять.