JavaRush /Курсы /Модуль 5. Spring /Лекция 176: Работа с REST API в микросервисах

Лекция 176: Работа с REST API в микросервисах

Модуль 5. Spring
18 уровень , 5 лекция
Открыта

REST — это не просто модное слово, которое любят разработчики. Это архитектурный стиль, который идеально подходит для микросервисных систем благодаря своей простоте, гибкости и масштабируемости. Давайте разберёмся почему.

  1. Лёгкость интеграции: REST использует протокол HTTP, который поддерживают все современные языки программирования, так что вы можете взаимодействовать с микросервисами на любой платформе.
  2. Принципы разделения обязанностей: REST-приложение разделяет клиент и сервер, что упрощает управление кодом.
  3. Масштабируемость: вы можете масштабировать микросервисы в зависимости от потребностей бизнеса, а REST API будет оставаться гибким средством для обмена данными.
  4. Кэширование: REST поддерживает кэширование ответов, что уменьшает нагрузку на сервер.

Итак, REST отлично подходит для построения микросервисов. Но как его проектировать и реализовывать? Погружаемся в детали.


Основы REST API в микросервисах

REST (Representational State Transfer) — это архитектурный стиль, который использует стандартные HTTP-методы (GET, POST, PUT, DELETE) для работы с ресурсами.

В микросервисной архитектуре каждый сервис обычно предоставляет REST API для взаимодействия с другими компонентами системы.

Пример REST API для микросервиса "Управление заказами"

Представьте, что мы проектируем систему управления заказами. У нас будет сервис Order Service, который предоставляет REST API для создания, получения, обновления и удаления заказов.

Пример ресурсов нашего сервиса:

  • GET /orders: получение списка заказов.
  • GET /orders/{id}: получение информации о конкретном заказе.
  • POST /orders: создание нового заказа.
  • PUT /orders/{id}: обновление существующего заказа.
  • DELETE /orders/{id}: удаление заказа.

Аннотации Spring для REST API

Spring Boot упрощает разработку REST API благодаря набору удобных аннотаций:

  1. @RestController: объединяет в себе @Controller и @ResponseBody. Указывает, что данный класс будет предоставлять REST API.
  2. @RequestMapping: используется для задания пути и метода запроса (например, GET, POST, PUT, DELETE).
  3. @GetMapping: упрощённая версия @RequestMapping для HTTP GET.
  4. @PostMapping: для HTTP POST.
  5. @PutMapping: для HTTP PUT.
  6. @DeleteMapping: для HTTP DELETE.
  7. @PathVariable: извлечение переменных из URI.
  8. @RequestParam: извлечение параметров из строки запроса.
  9. @RequestBody: преобразование JSON из тела запроса в объект Java.

Реализация REST API на практике

Давайте создадим простой REST API для управления заказами.

  1. Создание сущности Order:
    
    // Класс для описания заказа
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Order {
    private Long id;
    private String description;
    private Double totalAmount;
    }
    
  2. Реализация контроллера OrderController:
    
    @RestController
    @RequestMapping("/orders") // Базовый URI для всех методов
    public class OrderController {
    
        private List<Order> orders = new ArrayList<>();
    
        @GetMapping
        public List<Order> getAllOrders() {
            return orders;
        }
    
        @GetMapping("/{id}")
        public Order getOrderById(@PathVariable Long id) {
            return orders.stream()
                    .filter(order -> order.getId().equals(id))
                    .findFirst()
                    .orElseThrow(() -> new RuntimeException("Order not found"));
        }
    
        @PostMapping
        public Order createOrder(@RequestBody Order order) {
            orders.add(order);
            return order;
        }
    
        @PutMapping("/{id}")
        public Order updateOrder(@PathVariable Long id, @RequestBody Order updatedOrder) {
            Order existingOrder = getOrderById(id);
            existingOrder.setDescription(updatedOrder.getDescription());
            existingOrder.setTotalAmount(updatedOrder.getTotalAmount());
            return existingOrder;
        }
    
        @DeleteMapping("/{id}")
        public String deleteOrder(@PathVariable Long id) {
            Order order = getOrderById(id);
            orders.remove(order);
            return "Order deleted successfully!";
        }
    }
    
  3. Тестирование API: Теперь у нас есть полный CRUD для заказов. Вы можете протестировать его с помощью инструментов, таких как Postman или curl:
    • Создать заказ: POST /orders с JSON в теле ({"id":1, "description":"New Order", "totalAmount":100.0}).
    • Получить все заказы: GET /orders.
    • Получить заказ по ID: GET /orders/1.
    • Обновить заказ: PUT /orders/1 с обновлённым JSON.
    • Удалить заказ: DELETE /orders/1.

Советы по проектированию REST API

Как выбрать URI?

  • Используйте существительные в URI: вместо /getAllOrders используйте /orders.
  • Используйте множественное число для ресурсов: /orders, а не /order.
  • Для вложенных ресурсов следуйте иерархии: /orders/{orderId}/items.

Форматирование ответов

  • Возвращайте полезные HTTP-коды: 201 Created для создания, 404 Not Found для отсутствующего ресурса.
  • Используйте JSON как стандартный формат ответа (отлично поддерживается всеми языками).

Валидация данных

  • Используйте аннотацию @Valid для автоматической валидации.
  • Например:
    
    @PostMapping
    public Order createOrder(@Valid @RequestBody Order order) {
    orders.add(order);
    return order;
    }
    

Обработка ошибок

Создайте централизованный обработчик ошибок с помощью @ControllerAdvice. Пример:


@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleRuntimeException(RuntimeException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

Безопасность REST API

Хотя безопасность детально раскрывается в других лекциях, несколько ключевых моментов:

  • никогда не передавайте чувствительные данные (например, пароли) в URI.
  • реализуйте аутентификацию и авторизацию (см. Spring Security).
  • используйте HTTPS для шифрования данных.

Следующие шаги

Мы изучили как создавать REST API и работать с ним в микросервисной системе с помощью Spring Boot. На следующей лекции мы углубимся в практический пример и реализуем полный REST API микросервиса, включая подключение к базе данных, выполнение миграций и тестирование всех операций. А пока можете потренироваться в создании собственных REST API для других сущностей — например, продуктов, пользователей или транзакций.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ