Какие преимущества и недостатки у микросервисной архитектуры?

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

Ответ

Преимущества:

  1. Независимое масштабирование – каждый сервис масштабируется отдельно под свою нагрузку.
  2. Технологическая гибкость – разные сервисы могут быть реализованы на различных языках и технологических стеках.
  3. Устойчивость к отказам – сбой одного сервиса не приводит к полному отказу системы.
  4. Независимые циклы разработки и развертывания – команды могут работать и выпускать обновления автономно.

Недостатки:

  1. Высокая операционная сложность – требуется оркестрация (Kubernetes), централизованное логирование, трассировка и мониторинг.
  2. Сетевое взаимодействие – вызовы между сервисами (HTTP, gRPC) медленнее внутрипроцессных и подвержены сетевым сбоям.
  3. Сложность управления данными – обеспечение согласованности данных между сервисами требует паттернов вроде Saga или CQRS вместо простых ACID-транзакций.
  4. Нагрузка на DevOps – необходима сложная автоматизация сборки, тестирования и развертывания (CI/CD).

Практический пример разделения:

// Микросервис User Service (управление пользователями)
@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }
}
// Микросервис Order Service (управление заказами) вызывает User Service
@FeignClient(name = "user-service")
public interface UserServiceClient {
    @GetMapping("/api/users/{id}")
    User getUserById(@PathVariable("id") Long userId);
}

@Service
public class OrderService {
    public Order createOrder(Long userId) {
        // Вызов другого микросервиса для получения данных
        User user = userServiceClient.getUserById(userId);
        // ... логика создания заказа
    }
}