Сегодня мы переходим к самому интересному: практике. В этой лекции мы создадим простой микросервис с использованием 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 для событийно-ориентированной архитектуры. Всё это нас ждёт впереди!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ