В динамичной среде современной разработки программного обеспечения микросервисы стали предпочтительным архитектурным подходом. Хотя эта методология предлагает множество преимуществ, она не лишена и проблем. Традиционные службы на базе JVM часто сопровождаются такими проблемами, как большой объем памяти, увеличенное время запуска и высокая загрузка ЦП. Эти проблемы влияют не только на технические аспекты, но и имеют финансовые последствия, которые могут существенно повлиять на общую стоимость эксплуатации и обслуживания программных решений.
Собственный образ GraalVM — это ключевая функция GraalVM, высокопроизводительной среды выполнения, обеспечивающей поддержку различных языков программирования и режимов выполнения. В частности, GraalVM Native Image позволяет заранее скомпилировать приложения Java в автономные собственные исполняемые файлы, минуя необходимость в виртуальной машине Java (JVM) во время выполнения. Этот инновационный подход позволяет создавать исполняемые файлы, которые практически мгновенно запускаются и значительно сокращают потребление памяти по сравнению с их традиционными аналогами JVM. Эти собственные исполняемые файлы тщательно созданы и содержат только основные классы, методы и зависимые библиотеки, необходимые для функциональности приложения. Помимо своего технического совершенства, GraalVM Native Image представляет собой стратегическое решение с далеко идущими последствиями. Он не только решает технические проблемы, но и представляет убедительное финансовое обоснование. Облегчая разработку эффективных, безопасных и мгновенно масштабируемых облачных Java-приложений, GraalVM играет важную роль в оптимизации использования ресурсов и повышении экономической эффективности. По сути, оно играет ключевую роль в повышении производительности и финансовой эффективности программных решений в современных динамичных средах.
1. Большой объем памяти
Техническое воздействие
Традиционные службы на базе JVM часто требуют значительных затрат памяти из-за загрузки классов и метаданных для загруженных классов.
Финансовое дело
Высокое потребление памяти приводит к увеличению затрат на инфраструктуру. Устранение GraalVM метаданных для загруженных классов и другие оптимизации приводят к более эффективному использованию ресурсов, что приводит к потенциальной экономии затрат.
2. Увеличенное время начала
Техническое воздействие
Холодный запуск микросервисов может привести к увеличению времени отклика, что ухудшит взаимодействие с пользователем и потенциально приведет к ухудшению качества обслуживания.
Финансовое дело
Длительное время запуска не только влияет на удовлетворенность пользователей, но и способствует увеличению эксплуатационных расходов. Оптимизации GraalVM, такие как устранение накладных расходов на загрузку классов и предварительное создание кучи образов во время сборки, значительно сокращают время запуска, потенциально минимизируя эксплуатационные расходы.
3. Высокая загрузка ЦП
Техническое воздействие
Традиционные JVM часто сжигают циклы ЦП для профилирования и JIT-компиляции во время запуска.
Финансовое дело
Чрезмерное использование ЦП приводит к увеличению затрат на облачную инфраструктуру. Отсутствие в GraalVM накладных расходов на профилирование и JIT-обработку напрямую способствует снижению потребления ЦП, что приводит к потенциальной экономии затрат при использовании облака.
Микросервисы, особенно в бессерверных или контейнерных средах, часто сталкиваются с проблемой холодного запуска, что влияет на время отклика и удобство работы пользователей. GraalVM решает эту проблему, реализуя несколько оптимизаций:
1. Никаких накладных расходов на загрузку классов
Традиционные Java-приложения полагаются на загрузку классов во время выполнения для динамической загрузки и связывания классов. Этот процесс приводит к накладным расходам, особенно на этапе запуска. GraalVM минимизирует эти накладные расходы с помощью процесса, известного как статическая компиляция или компиляция с опережением времени (AOT). Это включает в себя предварительную загрузку, связывание и частичную инициацию всех классов, которые требуются приложению. В результате нет необходимости загружать классы во время запуска приложения.
2. Устранение интерпретируемого кода
Традиционные виртуальные машины Java полагаются на интерпретируемый режим выполнения перед применением JIT-компиляции (JIT). Это может привести к задержкам запуска и увеличению использования ЦП. Собственные исполняемые файлы не содержат интерпретируемого кода, что еще больше способствует ускорению запуска.
3. Никаких накладных расходов на профилирование и JIT-обработку
GraalVM позволяет избежать необходимости запуска JIT-компилятора (JIT), что снижает загрузку ЦП во время запуска.
4. Генерация кучи изображений во время сборки
Встроенная утилита создания изображений GraalVM позволяет выполнять процессы инициализации для определенных классов во время процесса сборки. В результате создается куча изображений, включающая предварительно инициализированные части, что ускоряет запуск приложения.
Встроенная утилита создания образов Oracle GraalVM продемонстрировала время запуска почти в 100 раз быстрее, чем традиционные приложения на базе JVM. На графике ниже показано существенное снижение требований к памяти во время выполнения, демонстрируя эффективность GraalVM по сравнению с HotSpot(Рисунок 1).
Рис. 1. Собственные исполняемые файлы запускаются почти мгновенно (oracle.com)
GraalVM способствует снижению потребления памяти за счет следующих оптимизаций:
1. Нет метаданных для загруженных классов
GraalVM избегает хранения метаданных для динамически загружаемых классов в памяти без кучи. В процессе сборки необходимая информация о классе предварительно загружается и связывается, что сводит к минимуму потребность в дополнительных метаданных во время выполнения.
2. Никаких данных профилирования или JIT-оптимизации
Поскольку байт-код уже находится в машинном коде, GraalVM устраняет необходимость сбора данных профилирования для JIT-оптимизации, сокращая нагрузку на память.
3. Технология изоляции
GraalVM представляет изоляты, технологию, которая разбивает кучу на более мелкие независимые «кучи», повышая эффективность, особенно в сценариях обработки запросов.
В целом он потребляет в 5 раз меньше памяти по сравнению с работой на JVM(Рисунок 2)
Рис. 2. Собственная память для исполняемых файлов в сравнении с Go или Java HotSpot (oracle.com)
В заключение, встроенная утилита создания образов GraalVM предлагает радикальное решение проблем, связанных с микросервисами, решая проблемы времени запуска, объема памяти и использования ЦП. Приняв GraalVM, разработчики могут создавать облачные Java-приложения, которые не только эффективны и безопасны, но и обеспечивают превосходное взаимодействие с пользователем.
Чтобы скомпилировать службу Quarkus в собственный образ, доступны различные методы. Хотя в этой статье не будет подробно описана процедура встроенной сборки Quarkus, в ней представлен обзор основных шагов.
Прежде чем приступить к созданию собственного образа, крайне важно настроить правильный собственный профиль в файле pom.xml. Добавьте следующий профиль:
native native
Создание собственного исполняемого файла с установленным GraalVM
Проверьте свою версию GraalVM с помощью следующей команды:
./gu info native-image
Эта команда отобразит установленную версию GraalVM:
Downloading: Component catalog from www.graalvm.org Filename : https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.0/native-image-installable-svm-java19-linux-amd64-22.3.0.jar Name : Native Image ID : native-image Version : 22.3.0 GraalVM : 22.3.0 Stability: Experimental Component bundle native-image cannot be installed - The same component Native Image (org.graalvm.native-image[22.3.0.0/55b341ca1bca5219aafa8ed7c8a2273b81d184dd600d8261c837fc32d2dedae5]) is already installed in version 22.3.0
А чтобы создать собственный исполняемый файл, используйте:
./mvnw install -Dnative
Эти команды генерируют двоичный файл *-runner в целевом каталоге, что позволяет запускать собственный исполняемый файл:
./target/*-runner
Создание собственного исполняемого файла без установленной GraalVM
Если локальная установка GraalVM вызывает трудности, можно использовать сборку в контейнере:
./mvnw install -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=graalvm
Эта команда инициирует сборку в контейнере Docker и предоставляет необходимый файл образа. Затем вы можете запустить приложение с помощью:
./target/*-runner
В случаях, когда создание собственного образа оказывается сложной задачей, команда RedHat предоставляет специализированный дистрибутив GraalVM, разработанный для платформы Quarkus, под названием Mandrel. Оправка упрощает работу
GraalVM, фокусируясь исключительно на возможностях создания собственных образов, необходимых для приложений Quarkus. Чтобы использовать оправку, выполните следующие действия:
Определите соответствующую версию репозитория Mandrel
Установите версию оправки в файле application.properties:
quarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.0.1.2-Final-java17
3.Запустите команду сборки Maven:
./mvnw clean install -Pnative
Для тех, кто предпочитает ручной контроль над созданием контейнера, можно использовать многоэтапную сборку Docker.
FROM quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.0.1.2-Final-java17 AS build COPY --chown=quarkus:quarkus mvnw /app/mvnw COPY --chown=quarkus:quarkus .mvn /app/.mvn COPY --chown=quarkus:quarkus pom.xml /app/ USER quarkus WORKDIR /app RUN ./mvnw -B org.apache.maven.plugins:maven-dependency-plugin:3.6.1:go-offline COPY src /app/src RUN ./mvnw package -Dnative FROM quay.io/quarkus/quarkus-micro-image:2.0 WORKDIR /app/ COPY --from=build /app/target/*-runner /app/application RUN chmod 775 /app /app/application \ && chown -R 1001 /app \ && chmod -R "g rwX" /app \ && chown -R 1001:root /app EXPOSE 8080 USER 1001 CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
Этот Dockerfile организует многоэтапную сборку, в результате которой создается образ Docker с вашим приложением Quarkus. Запустите этот файл Dockerfile, чтобы создать образ Docker, готовый к запуску вашего приложения Quarkus.
GraalVM Native Image — это мощная технология, которая может революционизировать способы разработки и развертывания микросервисов Java. Приняв GraalVM Native Image, вы можете создавать микросервисы, которые:
GraalVM Native Image — это ключевой инструмент облачной разработки Java, который поможет вам добиться производительности, масштабируемости и экономии средств, необходимых вашему бизнесу.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3