JavaRush /Курсы /Модуль 5. Spring /Лекция 173: Практика: создание микросервисов с использова...

Лекция 173: Практика: создание микросервисов с использованием Spring Boot

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

Сегодня мы переходим к самому интересному: практике. В этой лекции мы создадим простой микросервис с использованием Spring Boot.


Часть 1: Подготовка окружения и инструментария

Сначала подготовим окружение для нашего микросервиса. Для этого используем Spring Initializr, чтобы быстро сгенерировать стартовый проект.

Шаг 1: Создание проекта через Spring Initializr

Заходим на Spring Initializr и выбираем параметры проекта:

  • Project: Maven (или Gradle, если вы фанат).
  • Spring Boot Version: выбираем актуальную версию (например, 3.0.0+).
  • Dependencies:
    • Spring Web — для создания REST API.
    • Spring Data JPA — для работы с базой данных.
    • H2 Database — для простой встроенной базы данных (в реальном проекте вы можете заменить её на MySQL, PostgreSQL и т.д.).

Заполняем остальные параметры проекта, например:

  • Group: com.example
  • Artifact: orderservice
  • Name: OrderService

После этого нажимаем "Generate", скачиваем архив и распаковываем его.

Шаг 2: Импорт проекта в IDE

Импортируем проект в любимую IDE (например, IntelliJ IDEA или Eclipse). Затем открываем файл pom.xml и убеждаемся, что все зависимости подтянулись корректно. Если вы используете Gradle, проверьте файл build.gradle.


Часть 2: Разработка простого микросервиса

Мы создадим микросервис для управления заказами (OrderService). Наш микросервис будет предоставлять REST API для выполнения CRUD-операций с Order сущностью.

Шаг 1: Настройка сущностей и базы данных

Сущность Order

Создаём пакет com.example.orderservice.model, а затем создаём класс Order:


package com.example.orderservice.model;

import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String product;

    private Integer quantity;

    private Double price;

    private LocalDateTime orderDate;

    // Getters and Setters...

    // Конструктор без аргументов
    public Order() {}

    // Конструктор с параметрами
    public Order(String product, Integer quantity, Double price, LocalDateTime orderDate) {
        this.product = product;
        this.quantity = quantity;
        this.price = price;
        this.orderDate = orderDate;
    }
}
Примечание: если вы забудете добавить аннотацию @Entity, JPA вежливо проигнорирует ваш класс, и база данных даже не узнает о его существовании.

Конфигурация базы данных

В файле application.properties (или application.yml) добавьте конфигурацию для H2:

spring.datasource.url=jdbc:h2:mem:ordersdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update

Теперь у нас есть встроенная база данных, и мы можем взаимодействовать с ней через JPA.

Шаг 2: Создание репозитория

Добавим интерфейс репозитория для работы с нашей сущностью.

Создайте пакет com.example.orderservice.repository и внутри него класс OrderRepository:


package com.example.orderservice.repository;

import com.example.orderservice.model.Order;
import org.springframework.data.jpa.repository.JpaRepository;

public interface OrderRepository extends JpaRepository<Order, Long> {
}

С помощью этого интерфейса мы получаем все стандартные CRUD-операции.

Шаг 3: Реализация бизнес-логики (сервисный слой)

Добавим класс сервиса. Создайте пакет com.example.orderservice.service и класс OrderService:


package com.example.orderservice.service;

import com.example.orderservice.model.Order;
import com.example.orderservice.repository.OrderRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class OrderService {

    private final OrderRepository orderRepository;

    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public List<Order> getAllOrders() {
        return orderRepository.findAll();
    }

    public Order getOrderById(Long id) {
        return orderRepository.findById(id).orElseThrow(() -> new RuntimeException("Order not found"));
    }

    public Order createOrder(Order order) {
        return orderRepository.save(order);
    }

    public Order updateOrder(Long id, Order updatedOrder) {
        Order order = getOrderById(id);
        order.setProduct(updatedOrder.getProduct());
        order.setQuantity(updatedOrder.getQuantity());
        order.setPrice(updatedOrder.getPrice());
        return orderRepository.save(order);
    }

    public void deleteOrder(Long id) {
        orderRepository.deleteById(id);
    }
}

Шаг 4: Реализация REST API (контроллер)

Теперь создадим REST API. Создайте пакет com.example.orderservice.controller и класс OrderController:


package com.example.orderservice.controller;

import com.example.orderservice.model.Order;
import com.example.orderservice.service.OrderService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/orders")
public class OrderController {

    private final OrderService orderService;

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @GetMapping
    public List<Order> getAllOrders() {
        return orderService.getAllOrders();
    }

    @GetMapping("/{id}")
    public ResponseEntity<Order> getOrderById(@PathVariable Long id) {
        return ResponseEntity.ok(orderService.getOrderById(id));
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Order createOrder(@RequestBody Order order) {
        return orderService.createOrder(order);
    }

    @PutMapping("/{id}")
    public Order updateOrder(@PathVariable Long id, @RequestBody Order order) {
        return orderService.updateOrder(id, order);
    }

    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteOrder(@PathVariable Long id) {
        orderService.deleteOrder(id);
    }
}

Часть 3: Тестирование и отладка

Шаг 1: Запустите приложение

Запускаем OrderServiceApplication — главный класс нашего микросервиса:


package com.example.orderservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

Если всё сделано правильно, приложение будет запущено на порту 8080.

Шаг 2: Тестирование с помощью Postman или curl

Примеры запросов:

  • GET /api/orders — получить все заказы.
  • POST /api/orders с телом:

{
    "product": "Laptop",
    "quantity": 2,
    "price": 1200.00,
    "orderDate": "2023-10-01T10:00:00"
}
  • PUT /api/orders/1 для обновления существующего заказа.
  • DELETE /api/orders/1 для удаления заказа.

Часть 4: Что дальше?

Поздравляю! Мы создали базовый микросервис для управления заказами. Этот простой пример можно расширить, добавив такие фичи, как валидация входных данных, обработка ошибок, аутентификация, или интеграция с Kafka для событийно-ориентированной архитектуры. Всё это нас ждёт впереди!

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