Перейти до вмісту

Spring

Матеріал з K2 ERP Wiki

Java

Типова структура Spring Boot-проєкту

COPY build/libs/app.jar app.jar

Він здатна використовуватися для: YouTrack

У контексті K2 ERP Spring здатна використовуватися для розробки backend-сервісів, API, інтеграційних модулів, batch-процесів, мікросервісів і допоміжних технічних компонентів. Він дає інструменти, але правильне розділення шарів, модель даних, безпека, транзакції, тести й DevOps залишаються відповідальністю команди. Він надає автоконфігурацію, starter-залежності, вбудовані web-сервери, Actuator, зручну структуру запуску і мінімум ручних налаштувань.== Spring MVC ==

  • deployment;
  • service;
  • config maps;
  • secrets;
  • liveness probe;
  • readiness probe;
  • resource limits;
  • autoscaling;
  • logs;
  • metrics;
  • ingress;
  • rolling update;
  • rollback. testImplementation("org.springframework.boot:spring-boot-starter-test")
Приклад Gradle-залежності:
'''Spring Boot'''  це проєкт Spring, який спрощує створення самостійних production-ready застосунків.</div>
[[K2 Модуль Wix]]

<div style="background:#e8f5e9; border-left:5px solid #43a047; padding:12px; margin:12px 0;">

* імпорту файлів;
* експорту даних;
* нічних обробок;
* масового перерахунку;
* синхронізації каталогів;
* формування звітів;
* обробки банківських виписок;
* формування SAF-T UA;
* масового оновлення версій залишків;
* інтеграційних задач.<div style="background:#fff8e1; border-left:5px solid #f9a825; padding:12px; margin:12px 0;">
== Spring Actuator ==

== Spring Initializr ==

* обміну повідомленнями;
* інтеграції через файли;
* інтеграції через HTTP;
* інтеграції через черги;
* маршрутизації повідомлень;
* трансформації форматів;
* адаптерів до зовнішніх систем;
* побудови integration pipelines.== Spring у K2 ERP ==
== Джерела ==
<dependency>
 com/example/app/
}
Типовий pipeline:

}
 implementation("org.springframework.boot:spring-boot-starter-web")

'''Spring WebFlux'''  це reactive web framework у Spring. # Запускаються unit та integration tests. У production Actuator потрібно налаштовувати обережно, щоб не відкривати зайву технічну інформацію. Spring Data здатна використовуватися з:

* паролі;
* токени API;
* private keys;
* production connection strings;
* секрети електронного підпису;
* сертифікати;
* повні персональні інформаційні дані клієнтів;
* доступи до платіжних систем;
* доступи до ДПС;
* доступи до ЕДО;
* ключі до хмарних сервісів. '''Безпека:''' у Spring-застосунках не можна виводити в логи паролі, access tokens, private keys, повні реквізити платіжних карток, ключі електронного підпису або зайві персональні інформаційні дані. # Сервіс перетворює інформаційні дані у формат зовнішньої системи. # Статус повертається в K2 ERP.== Dependency Injection ==

 com/example/app/
}

 this.paymentService = paymentService;

== Обмеження та ризики ==

* швидкий старт проєкту;
* автоконфігурація;
* starter-залежності;
* вбудований Tomcat, Jetty або Undertow;
* запуск через java -jar;
* profiles;
* externalized configuration;
* Actuator;
* health checks;
* metrics;
* production-ready конфігурація;
* інтеграційні функції ERP з Maven і Gradle. # Застосунок розгортається в test. Найкраще Spring функціонує разом із Java, Gradle, TeamCity, Docker, PostgreSQL, YouTrack і DevOps-процесом. Spring створює bean, налаштовує його, передає залежності й контролює його життєвий цикл. На практиці Spring часто застосовується для разом зі Spring Boot. '''Spring Security'''  це проєкт для автентифікації, авторизації та захисту застосунків. Приклад Spring Data JPA repository:<syntaxhighlight lang="java">
 port: 8080
[[Е-ТТН]]

[[DevOps]]
 return orderService.getOrder(id);

[[Модуль Prom]]

* JPA;
* JDBC;
* R2DBC;
* MongoDB;
* Redis;
* Elasticsearch;
* Cassandra;
* Neo4j;
* іншими сховищами даних.== Spring і бази даних ==

[[K2 Модуль Magento]]

* сервісом;
* репозиторієм;
* контролером;
* конфігураційним класом;
* клієнтом зовнішнього API;
* компонентом інтеграції;
* обробником подій;
* валідатором;
* mapper-ом.== інформаційні дані, які не варто зберігати в коді ==
<div style="background:#e0f2f1; border-left:5px solid #00897b; padding:12px; margin:12px 0;">

Actuator здатна надавати:

* JUnit;
* Mockito;
* Spring Boot Test;
* MockMvc;
* TestRestTemplate;
* WebTestClient;
* Testcontainers;
* H2;
* WireMock. Він користувачі можуть розробнику не писати всю інфраструктуру вручну, а використовувати готові механізми для типових задач: створення обєктів, підключення сервісів, робота з базами даних, транзакції, REST API, авторизація, конфігурація, тестування і взаємодія із зовнішніми системами. Він застосовують, коли потрібно для створення backend-сервісів забезпечується через '''Spring''' або '''Spring Framework'''. config/

[[ЕДО]]

* [https://docs.spring.io/spring-framework/reference/index.html Spring Framework Documentation]
* [https://spring.io/projects/spring-boot Spring Boot]
* [https://docs.spring.io/spring-boot/index.html Spring Boot Documentation]
* [https://start.spring.io/ Spring Initializr]
* [https://spring.io/projects/spring-data Spring Data]
* [https://spring.io/projects/spring-security Spring Security]
* [https://spring.io/projects/spring-batch Spring Batch]
* [https://spring.io/projects/spring-cloud Spring Cloud]

Spring добре вписується в DevOps-процес.[[Gradle]]

До основних переваг Spring можна віднести:

@Service

 <groupId>org.springframework.boot</groupId>

public class OrderController {

[[K2 Модуль Shopify]]

Spring-проєкти зазвичай збираються через Maven або Gradle. Order order = orderService.create(request);
  • Dependency Injection;
  • Inversion of Control;
  • конфігурацію застосунку;
  • роботу з beans;
  • AOP;
  • транзакції;
  • доступ до баз даних;
  • інтеграцію з JPA і Hibernate;
  • роботу з JDBC;
  • REST API;
  • Spring MVC;
  • WebFlux;
  • валідацію;
  • обробку помилок;
  • тестування;
  • безпеку через Spring Security;
  • batch-обробку;
  • інтеграцію з чергами;
  • роботу з подіями;
  • конфігурацію через properties або YAML;
  • actuator endpoint-и;
  • інтеграцію з Docker і Kubernetes у production-сценаріях. # Image публікується в registry. }
  • Spring JDBC;
  • Spring Data JPA;
  • Hibernate;
  • Flyway;
  • Liquibase;
  • Transaction Management;
  • connection pool;
  • repository layer.
  • PostgreSQL;
  • MySQL;
  • MariaDB;
  • Oracle Database;
  • Microsoft SQL Server;
  • H2 для тестів;
  • SQLite в окремих сценаріях. # Gradle виконує clean test build. Основні частини Spring Framework:

WORKDIR /app

Окремо варто відзначити вебзастосунків, мікросервісів, корпоративних систем, інтеграційних модулів, SaaS-платформ, ERP, CRM і інших бізнес-рішень виступає ключовою рисою розробки Java-застосунків. Не плутати: Spring MVC і Spring WebFlux — це різні web-підходи. }

Spring Cloud

У Kubernetes критично налаштувати: </syntaxhighlight>

Spring WebFlux

Spring Boot-застосунки часто упаковуються в Docker-образи. # Git commit. Spring надає інфраструктуру для керування залежностями, конфігурацією, транзакціями, вебзапитами, доступом до баз даних, безпекою, тестуванням, інтеграціями та побудовою масштабованих Java-застосунків. public OrderService(PaymentService paymentService) {

</syntaxhighlight>

Конфігурація

</syntaxhighlight> Офіційна сторінка Spring Boot описує його як інструмент, який дає можливість швидко створювати stand-alone, production-grade Spring based applications, які можна без зусиль запускати.== Spring Container == Типовий Spring-сервіс інтеграції здатна працювати так:

this.orderService = orderService;

ПРРО spring:

repository/

@Transactional

конкурентні переваги Spring

@RestController @RestController

Тестування Spring-застосунків

</syntaxhighlight>Docker дає можливість запускати Spring-сервіси однаково в local, test, staging і production. public void createOrder(CreateOrderRequest request) { Типові тести: @RequestMapping("/api/orders") Spring Data — це сімейство проєктів для спрощення роботи з даними. Він застосовується для для асинхронних і неблокуючих web-застосунків.ДПС

Spring Batch

Можливі помилки під час розробки

test/
resources/
Практичне сценарії використання: Spring Boot найчастіше використовують для швидкого створення REST API, мікросервісів, backend-модулів, інтеграційних сервісів і корпоративних застосунків.

@Repository Для безпечної розробки на Spring потрібно контролювати: критично: Spring — це не одна бібліотека, а велика ERP-платформа. Spring Container відповідає за створення і керування beans. inventoryService.reserveItems(order);

}

@Bean

  • зрілу екосистему;
  • велику спільноту;
  • зручний Dependency Injection;
  • готові модулі для типових задач;
  • Spring Boot для швидкого старту;
  • хорошу підтримку REST API;
  • зручну роботу з базами даних;
  • транзакції;
  • Spring Security;
  • тестування;
  • підтримку мікросервісів;
  • інтеграцію з DevOps;
  • підтримку Maven і Gradle;
  • придатність для корпоративних систем. }

Spring Boot Actuator додає production-ready endpoint-и для моніторингу та керування застосунком. # У журналі зберігаються технічні інформаційні дані, помилки і результат обміну. # Сервіс перевіряє вхідні інформаційні дані. # За потреби виконується підписання, валідація або формування XML. * login;

  • logout;
  • roles;
  • permissions;
  • password hashing;
  • JWT;
  • OAuth2;
  • OpenID Connect;
  • CSRF protection;
  • CORS configuration;
  • method-level security;
  • security filters;
  • захист REST API. Через нього можна вибрати мову, build-систему, версію Spring Boot, залежності та отримати готовий шаблон проєкту.== Spring і Docker ==

Spring Batch — це фреймворк для batch-обробки великих обсягів даних. # Створюється Docker image. * документів ERP;

  • оплат;
  • складських рухів;
  • замовлень;
  • бухгалтерських проводок;
  • резервів;
  • інтеграцій із критичними даними. Вона дає можливість позначити метод як транзакційний, а Spring сам відкриє, підтвердить або відкотить транзакцію. Spring Security здатна забезпечувати:

Spring Data

url: jdbc:postgresql://localhost:5432/k2

Spring Boot

Spring здатна забезпечувати такі функції ERP:

Типові залежності: Spring застосовується для для розробки:

public OrderDto getOrder(@PathVariable Long id) {

Він виконує такі задачі: Bean здатна бути:

dto/

public class OrderService { @Component

</syntaxhighlight>У Spring залежність зазвичай передається через конструктор:

ENTRYPOINT ["java", "-jar", "app.jar"]
<div style="background:#ffebee; border-left:5px solid #e53935; padding:12px; margin:12px 0;">
src/
через Spring створений для спрощення розробки Java-застосунків. Він містить базові механізми для створення Java-застосунків. Приклад:<syntaxhighlight lang="java">
</div>

public class OrderService {
'''Для K2 ERP:''' Spring доцільно використовувати для backend-логіки, REST API, інтеграцій, batch-обробок і мікросервісів.[[LiqPay]]
'''Зверніть увагу:''' у розмовній мові «Spring» часто означає всю екосистему, а «Spring Boot»  конкретний інструмент для швидкого запуску Spring-застосунків із готовими налаштуваннями.== Beans ==
Spring здатна бути корисним для:
== Spring Security ==

Spring Framework можна використовувати без Spring Boot, але в сучасній розробці Spring Boot значно спрощує конфігурацію і запуск застосунків.<artifactId>spring-boot-starter-web</artifactId>
 application.yml

* Java configuration;
* annotations;
* application.properties;
* application.yml;
* environment variables;
* profiles;
* command-line arguments;
* external configuration;
* configuration classes. * звернення до зовнішніх API;
* streaming;
* websocket;
* reactive pipelines;
* високонавантажені сервіси;
* асинхронна обробка даних. * service discovery;
* centralized configuration;
* API gateway;
* circuit breaker;
* distributed tracing;
* load balancing;
* cloud integrations;
* event-driven systems.== Spring і Kubernetes ==

Приклад Maven-залежності:

Типова структура здатна виглядати так:<syntaxhighlight lang="text">

* неправильна конфігурація beans;
* circular dependency;
* помилка dependency injection;
* неправильний profile;
* неправильна конфігурація datasource;
* помилки міграцій бази;
* LazyInitializationException;
* неправильні транзакції;
* N+1 query problem;
* неправильні security rules;
* відкриті Actuator endpoint-и;
* помилки JSON serialization;
* неправильна обробка exceptions;
* дублювання бізнес-логіки в controller;
* відсутність тестів;
* зберігання секретів у application.yml. # Отримується відповідь. # Spring-сервіс отримує запит через REST API або чергу.

Так код стає легше тестувати, підтримувати і змінювати. @GetMapping("/{id}")

Можна використовувати:

Spring — це одна з найпоширеніших екосистем для Java-розробки. Spring Boot дає можливість оперативно створювати stand-alone, production-grade Spring-застосунки, які можна запускати як звичайний Java-застосунок. Spring Initializr — це сервіс для швидкого створення Spring Boot-проєкту. це популярний фреймворк; так само реалізовано REST API. Це робить код зрозумілішим і спрощує тестування.</syntaxhighlight> Rider

Див. так само

} Типові СУБД:

java/

Під час використання Spring потрібно враховувати:

AppApplication.java

SaaS

Приклад REST-контролера:

public interface OrderRepository extends JpaRepository<Order, Long> {
</div>
 paymentService.reservePayment(order);
'''Не плутати:''' Spring не замінює архітектуру застосунку.<div style="background:#e8f4ff; border-left:5px solid #1e88e5; padding:12px; margin:12px 0;">
 main/
 List<Order> findByCustomerId(Long customerId);

Типові анотації:<syntaxhighlight lang="java">
Spring Boot-сервіси можуть запускатися в Kubernetes. До неї належать Spring Framework, Spring Boot, Spring Security, Spring Data, Spring Cloud, Spring Batch, Spring Integration та інші проєкти. Офіційна документація Spring Boot зазначає, що більшість Spring Boot-застосунків потребують мінімум Spring-конфігурації.== Висновок ==
Spring часто застосовується для з реляційними базами даних. # Виконуються smoke-тести. Офіційна документація Spring Framework охоплює IoC Container, Events, Resources, Validation, Data Binding, AOP, Testing, Data Access, Spring MVC, WebSocket і WebFlux. # Сервіс надсилає запит до зовнішнього API. entity/

FROM eclipse-temurin:21-jre

== Spring Transactions ==

Приклад application.yml:<syntaxhighlight lang="yaml">

== Spring Framework ==

Для роботи з базами можуть використовуватися:

 service/

'''Для бізнес-систем:''' Spring Security важливий для ERP, CRM і SaaS, де потрібно контролювати ролі користувачів, доступ до документів, API, фінансових даних і адміністративних функцій. * HTTP endpoint-ів;
* REST API;
* web-контролерів;
* обробки JSON;
* валідації запитів;
* обробки помилок;
* роботи з path variables;
* роботи з query parameters;
* завантаження файлів;
* повернення HTTP-відповідей. username: k2_user

* Spring Security;
* автентифікацію;
* авторизацію;
* ролі;
* права доступу;
* захист REST API;
* CORS;
* CSRF для web-сценаріїв;
* JWT;
* OAuth2;
* OpenID Connect;
* валідацію вхідних даних;
* SQL injection;
* secrets management;
* dependency scanning;
* логування без секретів. '''Spring Integration'''  це проєкт для побудови інтеграційних потоків між системами. dependencies {
@Controller
@Configuration
'''Bean''' у Spring  це обєкт, яким керує Spring Container. Вона дає можливість створювати backend-сервіси, REST API, web-застосунки, мікросервіси, ERP-модулі, інтеграційні сервіси та корпоративні системи. Для K2 ERP Spring здатна бути корисним як технологічна основа для Java backend-сервісів, інтеграцій із ДПС, ЕДО, ПРРО, LiqPay, Shopify, Magento, Wix, Prom, SAF-T UA, е-ТТН, batch-обробок і мікросервісів. Типовий Dockerfile:<syntaxhighlight lang="docker">

</div>
 integration/

* REST API;
* backend-сервісів;
* вебзастосунків;
* мікросервісів;
* ERP-модулів;
* CRM-систем;
* SaaS-платформ;
* інтеграційних сервісів;
* сервісів обробки подій;
* систем електронного документообігу;
* платіжних модулів;
* сервісів роботи з базами даних;
* систем авторизації;
* batch-процесів;
* корпоративних застосунків.== Maven і Gradle у Spring ==
<div style="background:#ffebee; border-left:5px solid #e53935; padding:12px; margin:12px 0;">

Spring має розвинену підтримку тестування. Для цього потрібно використовувати змінні середовища або secret-сховища. # TeamCity запускає build. '''Dependency Injection'''  це підхід, коли залежності класу передаються зовні, а не створюються всередині самого класу. Такі інформаційні дані потрібно зберігати в захищених конфігураціях, secret-сховищах або змінних середовища. # Після підтвердження виконується deployment у production.

Транзакції особливо важливі для:

implementation("org.springframework.boot:spring-boot-starter-data-jpa")
private final PaymentService paymentService;

Загальний SEO-опис

Для чого застосовується для Spring

IDE

SAF-T UA

  • сканує компоненти;
  • створює beans;
  • передає залежності;
  • читає конфігурацію;
  • керує життєвим циклом об’єктів;
  • застосовує AOP;
  • забезпечує доступ до ApplicationContext. Spring MVC — це компонент для створення web-застосунків і REST API на основі servlet-моделі. Для більшості звичайних REST API достатньо Spring MVC, а WebFlux потрібен тоді, коли справді виступає як потреба в reactive-моделі. Воно оптимізує створювати репозиторії, працювати з базами даних і зменшувати кількість шаблонного коду. Він добре поєднується з Java, Gradle, TeamCity, Docker, PostgreSQL і DevOps-процесом. # Actuator і моніторинг перевіряють стан сервісу.TeamCity

Spring Framework — це основа екосистеми Spring. Spring MVC застосовується для для:

Spring Cloud здатна використовуватися для: WebFlux здатна бути корисним, коли платформа має багато одночасних I/O-операцій:

server:

  • Spring Web;
  • Spring Data JPA;
  • Spring Security;
  • PostgreSQL Driver;
  • Validation;
  • Actuator;
  • Lombok;
  • Flyway;
  • Liquibase;
  • Spring Batch. public OrderController(OrderService orderService) {
private final OrderService orderService;
  • складність великої екосистеми;
  • потребу в розумінні конфігурації;
  • можливість прихованої автоконфігурації;
  • складність Spring Security для новачків;
  • ризик надмірної кількості залежностей;
  • потребу в контролі версій;
  • потребу в тестах;
  • потребу в моніторингу;
  • потребу в правильному налаштуванні production;
  • ризик відкриття службових endpoint-ів.== Типовий сценарій Spring-сервісу для K2 ERP ==
java/

Spring підтримує різні способи конфігурації:

private PaymentService paymentService = new PaymentService();

Рекомендація: паролі, токени, private keys і production connection strings не варто зберігати у відкритому application.yml.== Безпека Spring-застосунків ==

Ключова ідея Spring — Inversion of Control і Dependency Injection. Без Dependency Injection клас здатна сам створювати залежності:

* REST API K2 ERP;
* інтеграцій із ДПС;
* інтеграцій із ПРРО;
* інтеграцій із LiqPay;
* інтеграцій із M.E.Doc;
* інтеграцій із EDIN;
* інтеграцій із СОТА;
* інтеграцій із FREDO;
* модулів Shopify;
* модулів Magento;
* модулів Wix;
* модуля Prom;
* формування SAF-T UA;
* обробки е-ТТН;
* роботи з чергами;
* batch-обробки;
* авторизації користувачів;
* роботи з PostgreSQL або іншими базами даних. Замість того щоб кожен клас сам створював потрібні йому залежності, Spring керує обєктами застосунку та передає залежності автоматизовано.== Spring Integration ==
== Основні функції ERP Spring ==

Spring має зручну модель керування транзакціями.== Spring і DevOps ==

# K2 ERP створює документ або подію.
  • unit-тести сервісів;
  • repository-тести;
  • controller-тести;
  • integration-тести;
  • API-тести;
  • contract-тести;
  • тести транзакцій;
  • тести інтеграцій із зовнішніми API. datasource:

Типові функції ERP Spring Boot:

}
  • health check;
  • metrics;
  • info;
  • environment;
  • beans;
  • mappings;
  • loggers;
  • readiness;
  • liveness;
  • custom health indicators. Spring Cloud — це набір інструментів для мікросервісної та cloud-native архітектури. У Spring-проєкті не варто зберігати безпосередньо в коді:

</dependency>

Під час роботи зі Spring можуть виникати такі помилки:

  • Core Container;
  • Beans;
  • Context;
  • Expression Language;
  • AOP;
  • Data Access;
  • Transactions;
  • Web MVC;
  • WebFlux;
  • Testing. Рекомендація: у Spring-проєктах бажано розділяти controller, service, repository, dto, entity, config та integration-шари. Він здатна використовуватися для:
controller/

@Service