Quarkus — Собственный Java-стек Kubernetes, разработанный специально для OpenJDK HotSpot и GraalVM, созданный на основе лучших в своем классе библиотек и стандартов Java. — это контейнерная среда, оптимизированная для быстрой загрузки и низкого потребления памяти. Фреймворк построен на основе многих популярных библиотек Java и обеспечивает поддержку для создания стандартных REST, а также микрореактивных и управляемых сообщениями микросервисов. Благодаря быстрому запуску и низкому использованию памяти Quarkus также может использоваться для реализации функций в безсерверной среде. Quarkus предоставляет множество возможностей для быстрой разработки приложений благодаря унифицированной конфигурации, удивительным функциям перезагрузки в реальном времени и поддержке инструментов.
Узнайте, как начать работу с Quarkus и создать API-интерфейс REST PetClinic.
Эта запись блога охватывает:
- Требования к среде разработки
- Создание нового проекта
- Разработка, сборка и запуск приложения с Java 11
- Конфигурация источника данных с Postgres и Flyway
- CRUD сервис с нумерацией страниц
- Создание интеграционных тестов
- Живая перезагрузка и отладка
- Докеризация приложения (как нативного, так и нативного)
О PetClinic API
Я решил повторно использовать модель PetClinic, которую использовал в этом блоге Spring Boot и Spring Data REST .
По сути, это базовая служба CRUD для управления воображаемой PetClinic: домашние животные, ветеринары, визиты и т. Д.
Prerequisities
докер
Docker будет использоваться для запуска докеризованной версии самой службы, но он также будет использоваться для запуска сервера PostgreSQL .
JDK 11 с GraalVM
API PetClinic будет построен с Java 11, поэтому JDK 11 должен быть установлен. Для сборки собственных исполняемых файлов должен присутствовать GraalVM 19.3+, и, поскольку он построен поверх OpenJDK 11, это будет лучшим выбором для этого урока. Самый простой способ установить (и управлять несколькими версиями) Java SDK с SDKMAN!
Узнайте, как управлять несколькими Java SDK с SDKMAN! легко
Для поддержки собственных образов убедитесь, что установлены все необходимые зависимости. Дополнительную информацию можно найти в документации GraalVM: https://www.graalvm.org/docs/reference-manual/native-image/
GraalVM официальная документация: GraalVM
Терминал
Сервис был разработан на macOS с iTerm2 и oh-my-zsh . Я также использую httpie как мой HTTP-клиент по умолчанию.
IntelliJ
Мой предпочтительный IDE — IntelliJ, и я использовал это, работая над этим проектом.
Узнайте больше об инструментах, которые я использовал на macOS в этой статье: macOS: необходимые инструменты для разработчика (Java)
Запустите PostgreSQL с помощью Docker
Приложение будет подключаться к серверу Postgres и в зависимости от профиля ( dev , test , prod ) будут применяться разные конфигурации. Для этого нам понадобятся три сервера: каждый с разными именем базы данных, портом и учетными данными. Чтобы упростить настройку, можно использовать Docker.
База данных разработчиков
- Создайте и запустите контейнер:
|
1
|
$ docker run --name petclinic-db-dev -p 5433:5432 -e POSTGRES_DB=petclinic-dev -e POSTGRES_USER=petclinic-dev -e POSTGRES_PASSWORD=petclinic-dev -d postgres:alpine |
- Запустить ранее остановленный контейнер:
|
1
|
$ docker start petclinic-db-dev |
Тестовая база данных
- Создайте и запустите контейнер:
|
1
|
$ docker run --name petclinic-db-test -p 5434:5432 -e POSTGRES_DB=petclinic-test -e POSTGRES_USER=petclinic-test -e POSTGRES_PASSWORD=petclinic-test -d postgres:alpine |
- Запустить ранее остановленный контейнер:
|
1
|
$ docker start petclinic-db-test |
База данных
- Создайте и запустите контейнер:
|
1
|
$ docker run --name petclinic-db -p 5432:5432 -e POSTGRES_DB=petclinic -e POSTGRES_USER=petclinic -e POSTGRES_PASSWORD=petclinic -d postgres:alpine |
- Запустить ранее остановленный контейнер:
|
1
|
$ docker start petclinic-db |
Начиная
Загрузите приложение
Вы можете загрузить приложение с помощью Maven из командной строки или использовать онлайн-генератор. Онлайновый генератор позволяет исследовать расширения и технологии, из которых может быть сделано приложение Quarkus, и не требует локальной установки Maven . Вы можете получить доступ к генератору здесь: https://code.quarkus.io
Для построения службы PetClinic API необходимы следующие расширения:
- RESTEasy JAX-RS — платформа REST, реализующая JAX-RS и многое другое
- RESTEasy Jackson — поддержка сериализации Jackson для RESTEasy
- SmallRye OpenAPI — Документирование ваших REST API с помощью OpenAPI — поставляется с Swagger UI
- Hibernate ORM с Panache — Определите свою постоянную модель в Hibernate ORM с Panache
- Hibernate Validator — проверка данных, поступающих на конечные точки REST
- Драйвер JDBC — PostgreSQL — коннектор базы данных PostgreSQL
- Flyway — управляйте миграцией схемы базы данных

После того, как зависимости выбраны, вы можете скачать zip, распаковать его и начать разработку сервиса.
Загруженный проект имеет стандартную компоновку проекта Maven . Он содержит Maven Wrapper, поэтому для разработки проекта не требуется локальная установка Maven . Вы также заметите src/main/docker с файлами Docker как для собственного, так и для образа JVM.
Основной файл конфигурации — application.properties — находится в src/main/resources . Эта папка также содержит папку META-INF/resources для статических ресурсов приложения, таких как файл index.html .
Установите версию Java на 11 в pom.xml а также в файлах Docker
Онлайновый генератор генерирует проект с Java 8 по умолчанию, поэтому для использования Java 11 необходимы некоторые корректировки.
- В
pom.xmlсгенерированного проекта измените версию Java:
|
1
2
|
<maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> |
- В
src/main/docker/Dockerfile.jvmустановитеARG JAVA_PACKAGE=java-11-openjdk-headless
Запустите проект в режиме разработки
После внесения изменений вы можете запустить приложение. Откройте свой терминал, перейдите в папку проекта и выполните следующую команду:
|
1
|
$ ./mvnw compile quarkus:dev |
Примечание. Quarkus имеет три встроенных режима: dev , test и prod зависимости от того, как вы запускаете приложение.
Разработка в IntelliJ
В IntelliJ вы просто открываете папку проекта или pom.xml . ( File > Open ). Проект можно запустить только с Maven . Это можно сделать с помощью конфигураций запуска Maven, поскольку нет основного класса для запуска приложения, как, например, в Spring Boot .

Для меня лучший опыт при разработке с Quarkus был, когда я запускал приложение в терминале, за пределами IntelliJ.
Отладка
Когда приложение Quarkus выполняется в режиме разработки, оно запускается с включенным протоколом отладки (на порту 5005). Для отладки приложения Quarkus в IntelliJ необходимо подключить отладчик к запущенному процессу через « Run > Attach to Process . У меня не было проблем с отладкой приложения.

Примечание. Вы можете запустить приложение в режиме разработки с отключенной отладкой: ./mvnw quarkus:dev -Ddebug=false , но, честно говоря, я не заметил каких-либо проблем с производительностью, если по умолчанию включен отладчик.
Live Обновить
На мой взгляд, живая перезагрузка — одна из самых сильных сторон Quarkus. Это работает потрясающе. По сути, вы можете изменить все, что захотите в исходном коде, выполнить запрос, и приложение перезагрузится в мгновение ока. Я перекрашивал классы и пакеты, перемещал файлы, добавлял и удалял конечные точки и все это без единого перезапуска.
Конфигурация источника данных
Все свойства находятся в src/main/resources/application.properties .
Свойства источника данных по умолчанию ( prod )
|
1
2
3
4
|
quarkus.datasource.url=jdbc:postgresql://localhost:5432/petclinicquarkus.datasource.driver=org.postgresql.Driverquarkus.datasource.username=petclinicquarkus.datasource.password=petclinic |
Свойства источника данных Dev ( dev )
Для настройки режима (или профиля) определенных свойств используйте %mode :
|
1
2
3
|
%dev.quarkus.datasource.url=jdbc:postgresql://localhost:5433/petclinic-dev%dev.quarkus.datasource.username=petclinic-dev%dev.quarkus.datasource.password=petclinic-dev |
Тестирование свойств источника данных ( test )
|
1
2
3
|
%test.quarkus.datasource.url=jdbc:postgresql://localhost:5434/petclinic-test%test.quarkus.datasource.username=petclinic-test%test.quarkus.datasource.password=petclinic-test |
Смотрите также: https://quarkus.io/guides/datasource
Миграция
Чтобы использовать Flyway, создайте папку db/migration igration в src/main/resources и добавьте свои файлы миграции. Мой первый файл миграции называется V1.0.0__PetClinic.sql и содержит всю схему (DDL) и пример данных для службы.
Примечание. Quarkus поддерживает импорт SQL, который можно настроить с помощью quarkus.hibernate-orm.sql-load-script для каждого профиля, но я не смог заставить его работать. Смотрите проблему, о которой я сообщил на Github: https://github.com/quarkusio/quarkus/issues/7358
Смотрите также: https://quarkus.io/guides/flyway
JPA Entities
Модель предметной области PetClinic относительно проста, но она состоит из однонаправленных и двунаправленных ассоциаций, а также базового наследования, что делает ее немного лучше, чем простая модель Hello World .

Обратите внимание, что в этом примере сущности JPA возвращаются непосредственно в ресурсах JAX-RS соответствующими репозиториями Panache (см. Ниже), поэтому классы сущностей содержат смесь аннотаций JPA и Джексона.
Например:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
@Entity@Table(name = "visits")public class Visit extends BaseEntity { @Column(name = "visit_date") @JsonFormat(pattern = "yyyy/MM/dd HH:mm") private LocalDateTime date; @NotEmpty @Column(name = "description") private String description; @ManyToOne @JoinColumn(name = "pet_id") private Pet pet; @ManyToOne @JoinColumn(name = "vet_id") private Vet vet; public Visit() { this.date = LocalDateTime.now(); }}@Entity@Table(name = "vets", uniqueConstraints = @UniqueConstraint(columnNames = {"first_name", "last_name"}))public class Vet extends Person { @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"), inverseJoinColumns = @JoinColumn(name = "specialty_id")) @JsonIgnore private Set<Specialty> specialties; @OneToMany(cascade = CascadeType.ALL, mappedBy = "vet", fetch = FetchType.EAGER) @JsonIgnore private Set<Visit> visits;} |
Все объекты находятся в пакете pl.codeleak.samples.petclinic.model .
Hibernate ORM с Panache
Если вы знакомы с Spring, я думаю, вы слышали о проекте Spring Data. На мой взгляд, Hibernate ORM с Panache имеет аналогичную цель: она упрощает разработку JPA, устраняя необходимость в повторяющейся и утомительной работе. Panache поддерживает сортировку, разбиение на страницы, java.util.Optional и java.utitl.stream.Stream и т. Д.
У вас есть два подхода для работы с Panache: создание сущностей с PanacheEntity или создание репозиториев с PanacheRepository . В этом проекте я попробовал оба подхода, но из-за некоторых проблем с наследованием в сущностях я решил придерживаться старомодного способа.
Базовое определение репозитория с Hibernate ORM с Panache:
|
1
2
3
4
5
|
public class OwnerRepository implements PanacheRepository<Owner> { List<Owner> findByLastName(String lastName) { return list("lastName", lastName); }} |
Все репозитории находятся в пакете pl.codeleak.samples.petclinic.repository .
Смотрите также: https://quarkus.io/guides/hibernate-orm-panache
Создание REST API
Ресурсы JAX-RS
Quarkus использует JAX-RS с RESTEasy. Для создания конечных точек API нам нужно создать ресурсы JAX-RS:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
@Path(OwnerResource.RESOURCE_PATH)@Produces(MediaType.APPLICATION_JSON)public class OwnerResource { public static final String RESOURCE_PATH = "/owners"; @Context UriInfo uriInfo; @Inject OwnerRepository ownerRepository; @Inject PetRepository petRepository; @GET public Response getAll(@BeanParam PageRequest pageRequest) { } @GET @Path("{id}") public Response getOne(@PathParam("id") Long id) { } @GET @Path("{id}/pets") public List<Pet> getPets(@PathParam("id") Long id) { } @POST @Consumes(MediaType.APPLICATION_JSON) @Transactional public Response create(@Valid Owner owner) { }} |
Внедрение зависимостей выполняется с помощью CDI — Context и Dependency Injection . Объекты ресурса будут автоматически настроены Quarkus. Все остальные зависимости должны быть настроены для внедрения зависимостей с аннотациями CDI.
Например, репозитории можно аннотировать с помощью @ApplicationScoped а затем вводить с помощью @Inject :
|
01
02
03
04
05
06
07
08
09
10
11
|
@ApplicationScopedpublic class OwnerRepository implements PanacheRepository<Owner> { List<Owner> findByLastName(String lastName) { return list("lastName", lastName); }}@ApplicationScopedpublic class PetRepository implements PanacheRepository<Pet> {} |
Все ресурсы находятся в пакете pl.codeleak.samples.petclinic.api .
Смотрите также: https://quarkus.io/guides/cdi-reference
пагинация
Как упоминалось ранее, Panache обеспечивает поддержку разбитых на страницы результатов. Мы можем легко использовать это в наших ресурсах:
|
1
2
3
4
5
6
|
@GETpublic Response getAll(@BeanParam PageRequest pageRequest) { return Response.ok(((PanacheRepository) petRepository).findAll() .page(Page.of(pageRequest.getPageNum(), pageRequest.getPageSize())) .list()).build();} |
PageRequest — это bean-компонент, содержащий параметры запроса pageNum и pageSize :
|
01
02
03
04
05
06
07
08
09
10
11
|
public class PageRequest { @QueryParam("pageNum") @DefaultValue("0") private int pageNum; @QueryParam("pageSize") @DefaultValue("10") private int pageSize;} |
Выполнение разбитого на страницы запроса может быть легко выполнено с помощью httpie:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
$ http get :8080/owners pageNum==0 pageSize==2HTTP/1.1 200 OKContent-Length: 250Content-Type: application/json[ { "address": "110 W. Liberty St.", "city": "Madison", "firstName": "George", "id": 1, "lastName": "Franklin", "telephone": "6085551023" }, { "address": "638 Cardinal Ave.", "city": "Sun Prairie", "firstName": "Betty", "id": 2, "lastName": "Davis", "telephone": "6085551749" }] |
операции
Создание нового объекта в JPA требует активной транзакции. Чтобы привязать транзакцию к текущему методу в объекте ресурса, используйте @Transactional , в противном случае во время выполнения метода будет @Transactional исключение:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@POST@Consumes(MediaType.APPLICATION_JSON)@Transactionalpublic Response create(@Valid Owner owner) { ownerRepository.persist(owner); var location = uriInfo.getAbsolutePathBuilder() .path("{id}") .resolveTemplate("id", owner.getId()) .build(); return Response.created(location).build();} |
Создать новый ресурс с httpie:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
$ http post :8080/owners <<< '{ "address": "110 W. Liberty St.", "city": "Madison", "firstName": "George", "lastName": "Franklin", "telephone": "6085551023"}'HTTP/1.1 201 CreatedContent-Length: 0Location: http://localhost:8080/owners/1042 |
Проверка
В проекте используется расширение Hibernate Validator. С этим расширением вы можете использовать стандартные аннотации проверки Hibernate (например, @NotBlank ), и когда входной параметр для методов ресурса аннотируется @Valid проверка будет автоматически инициирована, и клиенту, вызывающему этот метод, будет возвращен ответ об ошибке.
Пример ответа на следующий запрос:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
$ http post :8080/owners <<< '{}'HTTP/1.1 400 Bad RequestContent-Length: 626Content-Type: application/jsonvalidation-exception: true{ "classViolations": [], "exception": null, "parameterViolations": [ { "constraintType": "PARAMETER", "message": "must not be empty", "path": "create.owner.address", "value": "" }, ... { "constraintType": "PARAMETER", "message": "must not be empty", "path": "create.owner.telephone", "value": "" } ], "propertyViolations": [], "returnValueViolations": []} |
Замечание о фукциональности прямой перезагрузки: вы можете внести любые изменения в исходный код и выполнить новый запрос с помощью httpie. Приложение быстро перезагружается, и вы получаете немедленные результаты. Никаких перезапусков не требуется.
Смотрите также: https://quarkus.io/guides/validation
Поддержка Java 8 Date & Time
Типы java.util.time поддерживаются во время сериализации и десериализации JSON, когда расширение RESTEasy Jackson находится в проекте.
В следующем примере дата посещения должна быть сериализована и десериализована в формате, предоставленном аннотацией @JsonFormat :
|
1
2
3
4
5
6
7
8
9
|
@Entity@Table(name = "visits")public class Visit extends BaseEntity { @Column(name = "visit_date") @JsonFormat(pattern = "yyyy/MM/dd HH:mm") private LocalDateTime date;} |
Проверьте, как дата сериализуется с помощью htppie:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
$ http get :8080/visits/1HTTP/1.1 200 OKContent-Length: 174Content-Type: application/json{ "date": "2013/01/01 00:00", "description": "rabies shot", "id": 1, "pet": { "birthDate": "2012/09/04", "id": 7, "name": "Samantha" }, "vet": { "firstName": "Helen", "id": 2, "lastName": "Leary" }} |
Вы также можете сохранить посещение, используя требуемый формат даты и времени в теле запроса:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
$ http post :8080/visits <<< ' { "date": "2020/01/01 00:00", "description": "lorem ipsum", "pet": { "id": 7 }, "vet": { "id": 2 }}'HTTP/1.1 201 CreatedContent-Length: 0Location: http://localhost:8080/visits/1042 |
Поддержка OpenAPI / Swagger
Расширение SmallRye OpenAPI заботится о предоставлении документации по API, а SwaggerUI включен в режиме разработки.
Конечные точки по умолчанию:
- Документация OpenAPI —
/openapi - SwaggerUI —
/swaggerui

Смотрите также: https://quarkus.io/guides/openapi-swaggerui
Интеграционные тесты
Quarkus использует JUnit 5 и RESTAssured для интеграционного тестирования. Тесты могут быть созданы с использованием аннотаций @QuarkusTest и они выполняются с активным профилем test по умолчанию.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
@QuarkusTestpublic class PetResourceTest { @Test public void pagedList() { given() .when().get("/pets?pageNum=0&pageSize=2") .then() .statusCode(200) .body( "$.size()", is(2), "name", containsInAnyOrder("Leo", "Basil") ); }} |
Тесты Quarkus требуют, чтобы приложение работало. Существуют возможности замены выбранных bean-компонентов в тесте с использованием определений @Alternate компонентов CDI @Alternate . Альтернативные bean-компоненты должны быть помещены в src/test/java .
Примечание. Благодаря поддержке профилей вы можете легко настроить источник данных для test профиля с отдельным контейнером базы данных. См. Проверка свойств источника данных .
Смотрите также: https://quarkus.io/guides/getting-started-testing
Упаковка и запуск приложения
Приложение может быть упаковано ./mvnw package .
Он создает исполняемый файл quarkus-petclinic-api-1.0.0-runner.jar каталоге /target а зависимости копируются в каталог target/lib .
|
1
2
3
4
5
6
7
8
|
[INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building thin jar: /Users/rafal.borowiec/Projects/quarkus/quarkus-petclinic-api/target/quarkus-petclinic-api-1.0.0-runner.jar[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 1888ms[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 15.868 s[INFO] Finished at: 2020-02-23T19:18:25+01:00[INFO] ------------------------------------------------------------------------ |
Теперь приложение можно запустить с помощью java -jar target/quarkus-petclinic-api-1.0.0-runner.jar .
|
1
2
3
|
2020-02-23 19:19:10,169 INFO [io.quarkus] (main) quarkus-petclinic-api 1.0.0 (running on Quarkus 1.2.1.Final) started in 2.011s. Listening on: http://0.0.0.0:80802020-02-23 19:19:10,171 INFO [io.quarkus] (main) Profile prod activated.2020-02-23 19:19:10,171 INFO [io.quarkus] (main) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, rest-client, resteasy, resteasy-jackson, smallrye-openapi] |
Примечание: uber-jar может быть упакован с ./mvnw clean package -DskipTests=true -Dquarkus.package.uber-jar=true
Создайте контейнер Docker, который запускает приложение в режиме JVM
|
1
2
3
4
5
|
$ ./mvnw clean package$ docker build -f src/main/docker/Dockerfile.jvm -t quarkus/petclinic-api-jvm .Successfully built 1a5d963fedfaSuccessfully tagged quarkus/petclinic-api-jvm:latest |
Запустите контейнер со ссылкой, создайте контейнер базы данных Postgres и переопределите URL источника данных переменной среды:
|
1
2
3
4
5
6
|
$ docker run -i --rm -p 8080:8080 --link petclinic-db -e QUARKUS_DATASOURCE_URL='jdbc:postgresql://petclinic-db/petclinic' quarkus/petclinic-api-jvm2020-02-23 20:39:18,949 INFO [io.quarkus] (main) quarkus-petclinic-api 1.0.0 (running on Quarkus 1.2.1.Final) started in 3.475s. Listening on: http://0.0.0.0:80802020-02-23 20:39:18,949 INFO [io.quarkus] (main) Profile prod activated.2020-02-23 20:39:18,949 INFO [io.quarkus] (main) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, rest-client, resteasy, resteasy-jackson, smallrye-openapi |
Примечание: petclinic-db — это имя контейнера Postgres, созданного здесь: База данных Prod . Нам также нужно передать URL источника данных. Подробнее о переопределении свойств конфигурации во время выполнения: Переопределение свойств во время выполнения
Создать собственный исполняемый файл
Вы можете создать собственный исполняемый файл, используя следующую команду:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
$ ./mvnw package -Pnative[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Building native image from /Users/rafal.borowiec/Projects/quarkus/quarkus-petclinic-api/target/quarkus-petclinic-api-1.0.0-native-image-source-jar/quarkus-petclinic-api-1.0.0-runner.jar...[quarkus-petclinic-api-1.0.0-runner:50503] (typeflow): 72,535.72 ms[quarkus-petclinic-api-1.0.0-runner:50503] (objects): 49,325.68 ms[quarkus-petclinic-api-1.0.0-runner:50503] (features): 3,115.04 ms[quarkus-petclinic-api-1.0.0-runner:50503] analysis: 135,220.10 ms[quarkus-petclinic-api-1.0.0-runner:50503] (clinit): 1,966.77 ms[quarkus-petclinic-api-1.0.0-runner:50503] universe: 6,919.51 ms[quarkus-petclinic-api-1.0.0-runner:50503] (parse): 13,679.33 ms[quarkus-petclinic-api-1.0.0-runner:50503] (inline): 18,193.40 ms[quarkus-petclinic-api-1.0.0-runner:50503] (compile): 70,849.75 ms[quarkus-petclinic-api-1.0.0-runner:50503] compile: 111,062.75 ms[quarkus-petclinic-api-1.0.0-runner:50503] image: 8,843.46 ms[quarkus-petclinic-api-1.0.0-runner:50503] write: 1,789.58 ms[quarkus-petclinic-api-1.0.0-runner:50503] [total]: 282,727.03 ms[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 287304ms[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 04:58 min[INFO] Finished at: 2020-02-23T19:25:10+01:00[INFO] ------------------------------------------------------------------------ |
Процесс создания собственного исполняемого файла занимает довольно много времени, но стоит дождаться его завершения, чтобы увидеть время запуска приложения:
|
1
2
3
4
5
6
|
$ ./target/quarkus-petclinic-api-1.0.0-runner2020-02-23 19:26:03,959 INFO [io.quarkus] (main) quarkus-petclinic-api 1.0.0 (running on Quarkus 1.2.1.Final) started in 0.066s. Listening on: http://0.0.0.0:80802020-02-23 19:26:03,959 INFO [io.quarkus] (main) Profile prod activated.2020-02-23 19:26:03,959 INFO [io.quarkus] (main) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, rest-client, resteasy, resteasy-jackson, smallrye-openapi] |
0,67 секунды для собственного исполняемого файла, чтобы начать сравнение с 2 секундами для версии JVM.
Создайте контейнер Docker, который запускает приложение в основном режиме
По умолчанию собственный исполняемый файл создается в формате, поддерживаемом вашей операционной системой. Поскольку контейнер может не использовать тот же формат исполняемого файла, что и в вашей операционной системе, сборка Maven может создать исполняемый файл из контейнера:
|
1
|
$ ./mvnw package -Pnative -Dquarkus.native.container-build=true |
Чтобы настроить версию образа строителя, вам нужно установить quarkus.native.builder-image :
|
1
|
$ ./mvnw clean package -Pnative -DskipTests=true -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:20.0.0-java11 |
А теперь соберите и запустите контейнер:
|
1
2
3
|
$ docker build -f src/main/docker/Dockerfile.native -t quarkus/petclinic-api .$ docker run -i --rm -p 8080:8080 quarkus/petclinic-api |
Примечание. Подробнее о создании собственных исполняемых файлов можно найти в документации по Quarkus: https://quarkus.io/guides/building-native-image
Исходный код
Исходный код этой статьи можно найти на Github: https://github.com/kolorobot/quarkus-petclinic-api
|
Смотрите оригинальную статью здесь: Начало работы с Quarkus Мнения, высказанные участниками Java Code Geeks, являются их собственными. |