Сьогодні переходимо до найцікавішого: практики. У цій лекції ми створимо простий мікросервіс із використанням 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 для подієво-орієнтованої архітектури. Усе це попереду!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ