Многие Java-приложения стартуют 10 секунд и потребляют 500 МБ памяти. В Kubernetes это критично: медленный старт убивает автоскейлинг, а лишние ресурсы увеличивают счёт за облако. Мы переосмыслили подход к бэкенду — используем Quarkus, фреймворк, оптимизированный для cloud-native. Наши инженеры имеют 10+ лет опыта в Java и 50+ реализованных проектов. Гарантируем сокращение затрат на инфраструктуру в 3–5 раз за счёт нативной компиляции. Например, один клиент-ритейлер после миграции с Spring Boot сэкономил $4000 в месяц на облачных расходах.
Как Quarkus экономит ресурсы?
Quarkus компилирует приложение в native image через Quarkus. Время холодного старта — 0.01–0.1 секунды против 2–10 секунд у Spring Boot. Потребление памяти — 20–60 МБ против 200–500 МБ. Это не просто цифры: быстрый старт означает реальное горизонтальное масштабирование в Kubernetes, а для Serverless это разница между рабочим и нерабочим решением.
| Параметр | Quarkus (native) | Spring Boot (JVM) |
|---|---|---|
| Время старта | 0.01–0.1 с | 2–10 с |
| Потребление RAM | 20–60 МБ | 200–500 МБ |
| Размер Docker-образа | ~100 МБ | ~500 МБ |
| Готовность к Kubernetes | из коробки | требуется настройка |
Quarkus в 10 раз быстрее стартует и потребляет в 5 раз меньше памяти. Он использует знакомые спецификации: JAX-RS, CDI, JPA, MicroProfile. Переход с Spring занимает несколько дней. Основные отличия: DI через CDI (@ApplicationScoped), REST через RESTEasy Reactive (JAX-RS), ORM — Hibernate с Panache (Active Record или Repository).
Как устроена разработка на Quarkus?
Мы начинаем с настройки проекта и Dev Services: PostgreSQL, Kafka, Redis запускаются автоматически в Docker. Миграции через Flyway. Dev Mode Quarkus — один из лучших hot-reload механизмов в Java-экосистеме: изменения применяются без перезапуска.
Пример кода: сущность с Panache
// Product entity с Panache Active Record
@Entity
@Table(name = "products")
public class Product extends PanacheEntityBase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
@Column(nullable = false, length = 255)
public String name;
@Column(unique = true)
public String slug;
@Column(precision = 10, scale = 2)
public BigDecimal price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id")
public Category category;
public boolean isActive = true;
@Column(columnDefinition = "jsonb")
@Type(JsonType.class)
public Map<String, Object> attributes = new HashMap<>();
// Статические методы Panache
public static List<Product> findActive() {
return list("isActive", true);
}
public static Page<Product> findActiveByCategory(Long categoryId, int page, int size) {
return find("category.id = ?1 and isActive = true", categoryId)
.page(page, size);
}
}Ресурсы (контроллеры) реализуем с RESTEasy Reactive, поддерживающим неблокирующие операции нативно:
@Path("/api/v1/products")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApplicationScoped
public class ProductResource {
@Inject
ProductService productService;
@GET
@Authenticated
public Response list(
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("20") @Max(100) int size,
@QueryParam("category_id") Long categoryId) {
PanacheQuery<Product> query = categoryId != null
? Product.find("category.id = ?1 and isActive = true", categoryId)
: Product.find("isActive", true);
List<Product> products = query
.page(page, size)
.list();
long total = query.count();
return Response.ok(new PagedResponse<>(
products.stream().map(ProductDto::from).toList(),
page,
size,
total
)).build();
}
@POST
@RolesAllowed("admin")
@Transactional
public Response create(@Valid CreateProductRequest request) {
Product product = productService.create(request);
return Response.status(Response.Status.CREATED)
.entity(ProductDto.from(product))
.build();
}
@GET
@Path("/{id}")
public ProductDto get(@PathParam("id") Long id) {
return Product.findByIdOptional(id)
.map(ProductDto::from)
.orElseThrow(NotFoundException::new);
}
@DELETE
@Path("/{id}")
@RolesAllowed("admin")
@Transactional
public Response delete(@PathParam("id") Long id) {
boolean deleted = Product.deleteById(id);
return deleted ? Response.noContent().build() : Response.status(404).build();
}
} Как настроить безопасность?
Security настраиваем через SmallRye JWT. Конфигурация в application.properties:
mp.jwt.verify.publickey.location=META-INF/resources/publicKey.pem
mp.jwt.verify.issuer=https://myapp.com
quarkus.http.auth.permission.authenticated.paths=/api/v1/*
quarkus.http.auth.permission.authenticated.policy=authenticated
quarkus.http.auth.permission.public.paths=/api/v1/auth/*,/api/v1/products
quarkus.http.auth.permission.public.policy=permit Что даёт нативная компиляция?
Native build настраиваем один раз в CI/CD. Команда сборки:
./mvnw package -Pnative -DskipTests # или через Docker ./mvnw package -Pnative -Dquarkus.native.container-build=true На старте продакшена вы получаете бинарник, который запускается за миллисекунды. Это особенно важно для функций Serverless и эфемерных подов в Kubernetes.
Пример: интернет-магазин на Quarkus
Реализовали каталог с фильтрацией и корзину для крупного ритейлера. Исходный Spring Boot-проект стартовал 8 секунд, потреблял 400 МБ RAM. После миграции на Quarkus native: холодный старт — 0.05 с, память — 45 МБ. Дешёвый сервер на 2 ядра и 4 ГБ RAM справляется с пиковой нагрузкой 1000 RPS. Экономия на облаке составила 4 раза — более $4000 в месяц.
Процесс работы
- Аналитика и составление ТЗ. Фиксируем требования к API, сущностям, интеграциям.
- Настройка проекта: Quarkus 3.x, Java 21, PostgreSQL, Redis, Docker Compose.
- Разработка сущностей и ресурсов с использованием Panache и RESTEasy Reactive.
- Реализация авторизации (JWT, OAuth2, Keycloak).
- Интеграция с внешними сервисами через REST или очереди.
- Написание тестов (QuarkusTest + RestAssured).
- Настройка CI/CD с native build и деплоем в Kubernetes.
- Передача документации, репозитория, доступов и обучение команды.
Что входит в работу
- Разработка REST API с документацией OpenAPI
- Настройка авторизации (JWT, OAuth2, Keycloak)
- Миграции базы данных (Flyway/Liquibase)
- Интеграция с очередями (Kafka, RabbitMQ) и кэшем (Redis)
- Написание тестов (QuarkusTest + RestAssured)
- CI/CD pipeline с native build и деплоем в Kubernetes
- Передача репозитория, документации, доступов и обучение команды заказчика
Сроки (ориентировочно)
| Этап | Срок |
|---|---|
| Настройка проекта + Dev Services + миграции | 3–5 дней |
| Entities (Panache) + Resources | 1–1,5 недели |
| Security + JWT | 3–5 дней |
| Reactive endpoints | +1 неделя |
| Native build настройка | 2–5 дней |
| Тесты | 1 неделя |
| Корпоративный бэкенд (полный цикл) | 7–14 недель |
Свяжитесь с нами для оценки вашего проекта. Получите консультацию по миграции с Spring Boot или старту нового проекта. Мы гарантируем прозрачные сроки и результат, соответствующий Core Web Vitals.







