Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[SnowOne 2024] Антон Котов: В чём мощь Cloud Native Java?

jugnsk
April 30, 2024

[SnowOne 2024] Антон Котов: В чём мощь Cloud Native Java?

На примере Java разберем, что такое Cloud Native, почему это не только красиво звучит, но и позволяет экономить ресурсы.

В рамках доклада также сравним основные cloud-native фреймворки для Java: Micronaut и Quarkus.

Кроме этого, поговорим о преимуществах и ограничениях технологии GraalVM.

jugnsk

April 30, 2024
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. Об авторе 2 Deutsche Bank Яндекс Маркет SberDevices Ростелеком ИТ

    Разрабатываю свой сайт и мобильное приложение Выступаю на конференциях Играю на гитаре
  2. Что будет в докладе 3 Разбор понятия Cloud Native Как

    применяется к Java? Обзор основных фреймворков GraalVM: преимущества и ограничения Serverless
  3. Что такое Cloud Native? 1. Создание 2. Развертывание 3. Управление

    Современными приложениями в средах облачных вычислений 4
  4. Пример сервиса Расчет стоимости: vCPU: ~ 1,1 руб/час RAM (за

    1 GB): ~ 0,4 руб/час В месяц получаем: ~ 1 900 руб 3 стенда: ~ 5 700 руб 1 Мастер Kubernetes: ~ 6 400 руб Итого: минимум 12 000 руб 6 Frontend React Nodejs CRUD Service Java database 1 vCPU, 128 MB RAM 1 vCPU, 1 GB RAM
  5. Cloud-Native Java 1. OpenJDK Compact strings, docker awareness… Alpine Linux

    port 2. GraalVM Ahead-of-time Native Image compilation 7
  6. Проблемы классического подхода • IoC фреймворки, основанные на reflection •

    Фреймворк загружает и кэширует reflection-данные для каждого бина в контексте приложения • Большое время загрузки приложения • Большое потребление памяти [main] INFO Application - Started Application in 10.196 seconds (JVM running for 15.263) 8
  7. Micronaut и Quarkus Что общего? • Лицензия Apache License 2.0

    • Поддержка реактивного программирования • Поддержка Java, Kotlin, Groovy, Scala • Поддержка облачных технологий • Поддержка GraalVM Native Image 12
  8. Micronaut и Quarkus: в чем отличия? • Quarkus полагается на

    Jakarta EE / Java EE и Eclipse Micro Profile API, у Micronaut свой API (похож на Spring) 13 // Micronaut @Controller("/hello") public class HelloController { @Get(produces = MediaType.TEXT_PLAIN) public String index() { return "Hello World"; } } // Quarkus @Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "Hello RESTEasy"; } }
  9. Micronaut и Quarkus: документация • Основная документация для Micronaut размещена

    на одной странице • Для Quarkus – это каталог инструкций 14
  10. Micronaut и Quarkus: тестирование • Есть специальные аннотации, которые упрощают

    тестирование 19 // Micronaut @MicronautTest public class HelloControllerTest { @Test public void test() { } } // Quarkus @QuarkusTest public class GreetingResourceTest { @Test public void test() { } }
  11. Quarkus: native-тесты • Есть специальная аннотация для интеграционных тестов: @QuarkusIntegrationTest

    20 // maven-failsafe-plugin @QuarkusIntegrationTest public class GreetingResourceIT extends GreetingResourceTest { // Run the same tests } // maven-surefire-plugin @QuarkusTest public class GreetingResourceTest { @Test public void test() { } }
  12. Micronaut и Quarkus: обновление версий 21 • В Micronaut более

    болезненное обновление версий: 3.3.0 -> 3.9.4 • В Quarkus ничего не сломалось при обновлении: 2.6.1 -> 3.8.1
  13. Micronaut и Quarkus: что выбрать? 22 Micronaut Quarkus API ➕

    ➕ Документация ➕ ➖ Native-тесты ➖ ➕ Обновление версий ➖ ➕
  14. GraalVM: Native Image • Низкое потребление ресурсов • Компактный образ

    • Быстрое время старта • Улучшенная безопасность • Поддержка фреймворками 23
  15. GraalVM Native Image: ограничения • Ограниченная поддержка Java reflection •

    Автоматическая конфигурация • Ручная конфигурация -H:ReflectionConfigurationFiles=/path/to/reflectconfig Есть возможность запустить приложение с Tracing Agent, чтобы сгенерировать необходимую конфигурацию: java -agentlib:native-image-agent=config-output-dir=/path/to/config-dir/ ... • Unsafe.objectFieldOffset() может выдавать разные значения для build/run-time • Не все библиотеки поддерживают работу в Native-режиме (например Jooq) 25
  16. Что делать, если GraalVM AoT не сработал? • CRaC (Coordinated

    Restore at Checkpoint) Александр Ланцов — Прогревая JVM: CRaC и другие фокусы https://www.youtube.com/watch?v=2sPY6x5Lg8c • Lilliput Roman Kennke — Project Lilliput: Shrinking object headers in the Hotspot JVM https://www.youtube.com/watch?v=kbjZos2nUTo 26
  17. Serverless: контейнеры vs функции 1. Свое run-time окружение 2. Контейнеры

    можно тестировать локально 3. Контейнеры можно собирать локально 4. Контейнеры можно запускать быстрее, они переиспользуются и одновременно обрабатывают несколько запросов 28
  18. Serverless контейнеры: поставщики • Google Cloud Run • Yandex Serverless

    Containers • Amazon AWS Fargate • Microsoft Azure Container Instances 31
  19. Serverless контейнеры: Google vs Yandex • Есть поддержка параметра min-instances

    • Google умеет работать с HTTP/2 трафиком (можно использовать gRPC) • У Google есть поддержка startup CPU boost 32
  20. Google Cloud Run: startup CPU boost • up to 50%

    faster for the Spring PetClinic sample application • up to 47% faster for a Native Spring w/GraalVM service 33
  21. Время старта приложения 34 Реализация Время, с startup CPU boost

    Spring 15.263 Micronaut 3.094 Micronaut + GraalVM Native Image 0.109
  22. Время старта приложения 35 Реализация Время, с startup CPU boost

    Spring 15.263 8.182 Micronaut 3.094 2.593 Micronaut + GraalVM Native Image 0.109 0.109
  23. Выводы: Что дает Cloud Native для Java? 1. Уменьшение потребления

    ресурсов: CPU и RAM 2. Быстрое время старта (прогрев) приложения 3. Возможность использовать Serverless подход 36