Ответ
Преимущества:
- Независимое масштабирование – каждый сервис масштабируется отдельно под свою нагрузку.
- Технологическая гибкость – разные сервисы могут быть реализованы на различных языках и технологических стеках.
- Устойчивость к отказам – сбой одного сервиса не приводит к полному отказу системы.
- Независимые циклы разработки и развертывания – команды могут работать и выпускать обновления автономно.
Недостатки:
- Высокая операционная сложность – требуется оркестрация (Kubernetes), централизованное логирование, трассировка и мониторинг.
- Сетевое взаимодействие – вызовы между сервисами (HTTP, gRPC) медленнее внутрипроцессных и подвержены сетевым сбоям.
- Сложность управления данными – обеспечение согласованности данных между сервисами требует паттернов вроде Saga или CQRS вместо простых ACID-транзакций.
- Нагрузка на 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);
// ... логика создания заказа
}
}