Какие способы взаимодействия между сервисами вы использовали?

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

Ответ

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

Основные протоколы и технологии:

  • REST API (синхронный): Наиболее часто через Spring Boot с RestTemplate или декларативным клиентом Feign.
  • Асинхронные HTTP-запросы: С помощью реактивного WebClient из Spring WebFlux для неблокирующих вызовов.
  • Брокеры сообщений: Apache Kafka для асинхронной, событийной коммуникации и потоковой обработки.
  • Другие протоколы: Имею опыт работы с gRPC (для высокопроизводительных RPC) и GraphQL (для гибких запросов данных).

Примеры кода:

  1. Feign Client (REST):

    @FeignClient(name = "user-service", url = "${user.service.url}")
    public interface UserClient {
        @GetMapping("/users/{id}")
        User getUserById(@PathVariable Long id);
    }

    Spring Boot автоматически создает реализацию этого интерфейса для вызовов.

  2. WebClient (Асинхронный):

    Mono<Data> dataMono = WebClient.create("https://api.example.com")
        .get()
        .uri("/data")
        .retrieve()
        .bodyToMono(Data.class);

    Позволяет эффективно использовать ресурсы, не блокируя поток.

Почему важен выбор? Синхронные вызовы (REST) просты, но создают прямую зависимость. Асинхронные подходы (Kafka, WebClient) повышают отказоустойчивость и масштабируемость системы.