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

Публікації

Показано дописи з міткою "Spring"

Запуск застосунку Spring Boot як системного сервісу Ubuntu

Для більш стабільної роботи web-застосунки краще запускати на сервері як системні сервіси. Для цього спершу потрібно створити власний системний сервіс: sudo nano /etc/systemd/system/myapp.service У цей файл потрібно додати код: [Unit] Description=Spring Boot Application After=network.target [Service] Type=simple User=ubuntu Group=ubuntu WorkingDirectory=/opt/myapp ExecStart=/usr/bin/mvn spring-boot:run -Dspring-boot.run.profiles=prod Restart=on-failure RestartSec=10 SuccessExitStatus=143 [Install] WantedBy=multi-user.target User та Group - це дані користувача, WorkingDirectory - шлях до застосунку, ExecStart - команда для запуску (в даному випадку запускається з сирцевого коду, але краще скомпілювати і запускати jar-файл). Далі потрібно зберегти файл та виконати команду: sudo systemctl daemon-reload Перевірити статус сервісу: sudo systemctl status myapp.service Запустити сервіс: sudo systemctl start myapp.service Щоб сервіс запускався автоматично після переза...

Запуск Java-застосунків без root-доступу на портах 443, 80

За замовчуванням на Linux користувачі з без прав доступу root не мають права запускати Java-застосунки на портах менших за 1024. Зокрема, при запуску Spring Boot можна отримати помилку java.net.BindException: Permission denied . Розберемо варіанти, як це можна виправити. Запуск через sudo Перед командою запуску можна додати sudo , якщо користувач має право його використовувати. Більше про запуск проєктів на Spring Boot . Надати користувачу відповідні права Власне, користувачу можна надати відповідні права адміністратора. Більше про права користувачів у Linux . Запуск на іншому порту Якщо на машині є Apache, nginx або інший сервер або його можна встановити, то можна запустити Java-застосунок на іншому порті: 8080, 8443 тощо і зробити відповідні налаштування переадресації. Надати додаткові дозволи для JDK Спочатку потрібно дізнати адресу поточного jdk : readlink -f "$(which java)" Наприклад, відповідь може бути типу /usr/lib/jvm/java-17-openjdk-amd64/bin/java . Після...

Робота Spring-застосунку через Tor

Якщо потрібно виконувати HTTP-запити через мережу Tor із Java-застосунку, найкраще використовувати окремий системний сервіс Tor, а не Tor Browser. Системний Tor працює у фоновому режимі, підтримує SOCKS-проксі, ControlPort та дозволяє програмно змінювати IP-адресу за допомогою команди SIGNAL NEWNYM . У цій інструкції розглянемо встановлення Tor на Ubuntu, налаштування SOCKS-проксі та інтеграцію зі Spring Boot через RestTemplate . Встановлення Tor Оновіть список пакетів та встановіть Tor: sudo apt update sudo apt install tor Переконайтеся, що сервіс працює: systemctl status tor Якщо сервіс не запущений: sudo systemctl start tor sudo systemctl enable tor Налаштування Tor Основний файл конфігурації знаходиться за адресою: /etc/tor/torrc Додайте до нього наступні параметри: # SOCKS-проксі SocksPort 9052 # Порт керування ControlPort 9051 # Використовуємо пароль CookieAuthentication 0 HashedControlPassword 16:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX У...

DatabaseClient в WebFlux

DatabaseClient у Spring WebFlux DatabaseClient — це низькорівневий реактивний API для роботи з реляційними базами даних у Spring WebFlux. Він входить до складу Spring Data R2DBC та дозволяє виконувати SQL-запити без використання блокуючого JDBC. Якщо JdbcTemplate є стандартним рішенням для Spring MVC, то DatabaseClient виконує аналогічну роль у реактивному стеку. Він надає простий спосіб виконання SQL-запитів, прив'язки параметрів та перетворення результатів у Java-об'єкти. DatabaseClient працює поверх драйвера R2DBC і повертає реактивні типи Mono<T> та Flux<T> , що дозволяє повністю зберігати неблокуючу модель виконання. DatabaseClient добре підходить у таких випадках: необхідно виконувати власні SQL-запити; потрібен повний контроль над SQL; проєкт використовує Spring WebFlux та R2DBC; запити занадто складні для похідних методів Repository; необхідно отримувати лише окремі поля, а не цілі сутності; потрібно виконувати JOIN, агрегатні функції або...

GraalVM Native Image для прискорення Java-застосунків

GraalVM Native Image GraalVM Native Image — це технологія попередньої компіляції (ahead-of-time — AOT) Java-застосунків у самостійні нативні виконувані файли (бінарники). На відміну від звичайної Java, де код виконується у Java Virtual Machine (JVM), Native Image створює файл, який працює безпосередньо в операційній системі, значно прискорюючи запуск (за мілісекунди) та зменшуючи використання пам'яті. Ключові особливості та переваги: Миттєвий запуск . Програми запускаються практично миттєво, що критично важливо для Serverless (наприклад, AWS Lambda) та мікросервісів. Низьке споживання пам'яті . Native Image споживає значно менше оперативної пам'яті, оскільки не потребує завантаження віртуальної машини JVM, метаданих класів та JIT-компілятора. Самодостатність . Створений виконуваний файл містить лише необхідний код програми та бібліотек, що робить його меншим за розміром, ніж JAR-файл разом із JRE. Безпека та ізоляція . Нативні образи забезпечують закриту систему, в...

Apache Camel для інтеграції сервісів

Уявіть, що ваш застосунок отримує замовлення через REST API, повинен зберегти їх у базі даних, відправити підтвердження на пошту, поставити завдання у RabbitMQ і записати лог у файл. Написати це вручну — реально, але нудно та схильно до помилок. Apache Camel робить такі речі декларативно. Що таке Apache Camel Apache Camel — це open-source інтеграційний фреймворк для JVM, який реалізує класичні Enterprise Integration Patterns (EIP) з однойменної книги Гоппе та Вульфа. Перший реліз вийшов у 2007 році, і фреймворк досі активно розвивається. Головна ідея: є маршрути (routes) — трубопроводи, якими «течуть» повідомлення від джерела ( from ) до одержувача ( to ). По дорозі повідомлення можна трансформувати, фільтрувати, маршрутизувати та збагачувати даними. Коротко: Camel — це клей між різнорідними системами. Він не замінює брокери черг, БД чи HTTP-сервери, а з'єднує їх між собою. Мінімальний приклад Читаємо CSV-файли з папки та відправляємо кожен рядок у чергу Ra...