«1. Введение
В настоящее время очень распространено написать приложение и развернуть его в облаке, не беспокоясь об инфраструктуре. Бессерверные технологии и FaaS стали очень популярными.
В среде такого типа, где экземпляры часто создаются и уничтожаются, время загрузки и время первого запроса чрезвычайно важны, поскольку они могут создать совершенно другой пользовательский опыт.
Такие языки, как JavaScript и Python, всегда находятся в центре внимания в таких сценариях. Другими словами, Java с ее толстыми JAR-файлами и долгим временем загрузки никогда не была главным соперником.
В этом руководстве мы представим Quarkus и обсудим, является ли он альтернативой для более эффективного переноса Java в облако.
2. QuarkusIO
QuarkusIO, сверхзвуковая субатомная Java, обещает предоставлять небольшие артефакты, чрезвычайно быструю загрузку и меньшее время до первого запроса. В сочетании с GraalVM Quarkus будет выполнять предварительную компиляцию (AOT).
А поскольку Quarkus построен на основе стандартов, нам не нужно изучать что-то новое. Следовательно, мы можем использовать, среди прочего, CDI и JAX-RS. Также у Quarkus есть множество расширений, в том числе поддерживающих Hibernate, Kafka, OpenShift, Kubernetes и Vert.x.
3. Наше первое приложение
Самый простой способ создать новый проект Quarkus — открыть терминал и ввести:
mvn io.quarkus:quarkus-maven-plugin:0.13.1:create \
-DprojectGroupId=com.baeldung.quarkus \
-DprojectArtifactId=quarkus-project \
-DclassName="com.baeldung.quarkus.HelloResource" \
-Dpath="/hello"
Это сгенерирует скелет проекта, HelloResource с открытой конечной точкой /hello, конфигурация, проект Maven и файлы Dockerfile.
После импорта в нашу IDE у нас будет структура, подобная той, что показана на изображении ниже:
Давайте рассмотрим содержимое класса HelloResource:
@Path("/hello")
public class HelloResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
Пока все выглядит хорошо. На данный момент у нас есть простое приложение с одной конечной точкой RESTEasy JAX-RS. Давайте продолжим и протестируем его, открыв терминал и выполнив команду:
./mvnw compile quarkus:dev:
Наша конечная точка REST должна быть открыта по адресу localhost:8080/hello. Давайте проверим это с помощью команды curl:
$ curl localhost:8080/hello
hello
4. Горячая перезагрузка
При работе в режиме разработки (./mvn compile quarkus:dev) Quarkus предоставляет возможность горячей перезагрузки. Другими словами, изменения, внесенные в файлы Java или файлы конфигурации, будут автоматически скомпилированы после обновления браузера. Самая впечатляющая особенность здесь в том, что нам не нужно сохранять наши файлы. Это может быть хорошо или плохо, в зависимости от наших предпочтений.
Теперь мы изменим наш пример, чтобы продемонстрировать возможность горячей перезагрузки. Если приложение остановлено, мы можем просто перезапустить его в режиме разработки. Мы будем использовать тот же пример, что и раньше, в качестве отправной точки.
Сначала мы создадим класс HelloService:
@ApplicationScoped
public class HelloService {
public String politeHello(String name){
return "Hello Mr/Mrs " + name;
}
}
Теперь мы изменим класс HelloResource, внедрив HelloService и добавив новый метод:
@Inject
HelloService helloService;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/polite/{name}")
public String greeting(@PathParam("name") String name) {
return helloService.politeHello(name);
}
Далее, давайте протестируем наш новый endpoint:
$ curl localhost:8080/hello/polite/Baeldung
Hello Mr/Mrs Baeldung
Мы внесем еще одно изменение, чтобы продемонстрировать, что то же самое можно применить к файлам свойств. Давайте отредактируем файл application.properties и добавим еще один ключ:
greeting=Good morning
После этого мы изменим HelloService, чтобы использовать наше новое свойство:
@ConfigProperty(name = "greeting")
private String greeting;
public String politeHello(String name){
return greeting + " " + name;
}
Если мы выполним ту же команду curl, мы должны теперь см.:
Good morning Baeldung
Мы можем легко упаковать приложение, запустив:
./mvnw package
Это сгенерирует 2 файла jar внутри целевого каталога:
-
quarkus-project-1.0-SNAPSHOT-runner.jar â — исполняемый файл jar с зависимостями, скопированными в target/lib quarkus-project-1.0-SNAPSHOT.jar — содержит классы и файлы ресурсов
Теперь мы можем запустить упакованное приложение:
java -jar target/quarkus-project-1.0-SNAPSHOT-runner.jar
5. Родной Изображение
Далее мы создадим собственный образ нашего приложения. Нативное изображение уменьшит время запуска и время до первого ответа. Другими словами, он содержит все необходимое для запуска, включая минимальную JVM, необходимую для запуска приложения.
Для начала нам нужно установить GraalVM и настроить переменную среды GRAALVM_HOME.
Теперь мы остановим приложение (Ctrl + C), если оно еще не остановлено, и выполним команду:
./mvnw package -Pnative
«
«Это может занять несколько секунд. Поскольку собственные образы пытаются создать весь код AOT для более быстрой загрузки, в результате у нас будет больше времени сборки.
Мы можем запустить ./mvnw verify -Pnative, чтобы убедиться, что наш собственный артефакт был правильно сконструирован:
./mvnw package -Pnative -Dnative-image.docker-build=true
Во-вторых, мы создадим образ контейнера, используя наш собственный исполняемый файл. Для этого у нас должна быть запущена среда выполнения контейнера (например, Docker). Давайте откроем окно терминала и выполним:
Это создаст 64-битный исполняемый файл Linux, поэтому, если мы используем другую ОС, он может больше не работать. Это нормально на данный момент.
FROM registry.fedoraproject.org/fedora-minimal
WORKDIR /work/
COPY target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
Генерация проекта создала для нас Dockerfile.native:
docker build -f src/main/docker/Dockerfile.native -t quarkus/quarkus-project .
Если мы изучим файл, у нас будет намек на то, что будет дальше. Сначала мы создадим образ докера:
docker run -i --rm -p 8080:8080 quarkus/quarkus-project
Теперь мы можем запустить контейнер, используя:
Контейнер запустился за невероятно короткое время — 0,009 с. Это одна из сильных сторон Quarkus.
$ curl localhost:8080/hello/polite/Baeldung
Good morning Baeldung
Наконец, мы должны протестировать наш модифицированный REST для проверки нашего приложения:
6. Развертывание в OpenShift
oc new-build --binary --name=quarkus-project -l app=quarkus-project
oc patch bc/quarkus-project -p '{"spec":{"strategy":{"dockerStrategy":{"dockerfilePath":"src/main/docker/Dockerfile.native"}}}}'
oc start-build quarkus-project --from-dir=. --follow
oc new-app --image-stream=quarkus-project:latest
oc expose service quarkus-project
После того, как мы закончим локальное тестирование с помощью Docker, мы развернем наш контейнер в OpenShift. Предполагая, что у нас есть образ Docker в нашем реестре, мы можем развернуть приложение, выполнив следующие шаги:
oc get route
Теперь мы можем получить URL-адрес приложения, выполнив:
$ curl http://quarkus-project-myproject.192.168.64.2.nip.io/hello/polite/Baeldung
Good morning Baeldung
Наконец, мы получим доступ к одна и та же конечная точка (обратите внимание, что URL-адрес может отличаться в зависимости от нашего IP-адреса):
7. Заключение
В этой статье мы продемонстрировали, что Quarkus — отличное дополнение, которое может более эффективно внедрить Java в облако. Например, теперь можно представить Java на AWS Lambda. Кроме того, Quarkus основан на таких стандартах, как JPA и JAX/RS. Поэтому нам не нужно узнавать ничего нового.
В последнее время Quarkus привлек большое внимание, и каждый день добавляется множество новых функций. В репозитории Quarkus GitHub есть несколько проектов быстрого старта, где мы можем попробовать Quarkus.