Рубрики
Без рубрики

Quarks – Разработайте Свое Первое Сверхзвуковое Корпоративное Java-Приложение

В этой статье мы приступим к нашему первому применению сверхзвуковых кварков. Мы будем… Помеченный кварками, java, облаком.

В этой статье мы приступим к нашему первому применению сверхзвуковых кварков. Мы разработаем приложение RESTful, используя знакомые API JAX-RS и CDI, узнаем, как запустить его в среде Quarkus, и посмотрим, как его протестировать.

Недавно было анонсировано Quarks 1.0 , что стало важной вехой для сообщества Java.

Quarks – это стек с открытым исходным кодом для написания Java-приложений, предлагающий беспрецедентное время запуска, объем памяти и опыт разработчиков. Он предлагает знакомые модели программирования и API (Hibernate, JAX-RS, Eclipse Vert.x, Apache Camel, микропрофиль Eclipse, совместимость с Spring API и многое другое).

В этой статье мы собираемся начать работу с нашим первым приложением Quarks, более конкретно с приложением RESTful , использующим знакомые API-интерфейсы JAX-RS и CDI от Jakarta EE . Мы также посмотрим, как протестировать наше приложение. Вы можете найти исходный код на моем GitHub.

1. Предпосылки

Чтобы следовать этому руководству, вам понадобится:

  • JDK 8 или 11+
  • ИДЕЯ
  • Apache Maven 3.5.3+
  • Уровень 5.5.0+

Я буду использовать Gradle для создания приложения, но вы можете свободно использовать Maven. Имейте в виду, что использование Gradle с кварками – это функция предварительного просмотра. Возможно, он не поддерживает все возможные сценарии, но он достаточно хорошо работает для приложения, которое мы собираемся создать в этом руководстве.

2. Загрузка приложения Quark u s

Приложение, которое мы собираемся разработать, представляет собой фиктивное приложение RESTful для библиотеки, которое предоставляет конечную точку для извлечения всех доступных книг.

Мы можем быстро запустить приложение Quark u двумя способами: используя Maven из командной строки или используя удобный генератор приложений на основе пользовательского интерфейса.

В обоих случаях нам необходимо предоставить некоторую важную информацию:

  • идентификаторы групп и артефактов
  • инструмент сборки (Maven или Gradle)
  • расширения (т.е. зависимости).

Расширение RESTeasy JAX-RS включено по умолчанию, в то время как нам необходимо явно включить расширение RESTeasy JSON-B .

Используя генератор Maven, мы также можем указать класс ресурсов, который будет автоматически сгенерирован и настроен для JAX-RS, и дополнительный путь.

Давайте рассмотрим оба варианта.

Использование Maven для создания приложения Quark u s

Давайте откроем окно терминала и выполним следующую команду для создания приложения, которое будет использовать Maven в качестве встроенного инструмента:

mvn io.quarkus:quarkus-maven-plugin:1.0.0.CR1:create \
    -DprojectGroupId=com.thomasvitale \
    -DprojectArtifactId=quarkus-getting-started \
    -DclassName="com.thomasvitale.library.BookResource" \
    -Dpath="/books" \
    -Dextensions="resteasy-jsonb"

Если мы предпочитаем использовать Gradle в качестве инструмента для создания нашего приложения, мы можем сделать это таким образом (обратите внимание на дополнительный инструмент построения параметр):

mvn io.quarkus:quarkus-maven-plugin:1.0.0.CR1:create \
    -DprojectGroupId=com.thomasvitale \
    -DprojectArtifactId=quarkus-getting-started \
    -DclassName="com.thomasvitale.library.BookResource" \
    -Dpath="/books" \
    -Dextensions="resteasy-jsonb" \
    -DbuildTool=gradle

Использование инициализатора на основе пользовательского интерфейса для создания приложения Quark u.s

В качестве альтернативы Maven мы можем перейти к коду.quarks.io и создайте наше приложение Quarks с удобным пользовательским интерфейсом, куда можно вставить все сведения о проекте, инструменте сборки и необходимых нам расширениях. Знакомы ли вы с Spring Initializr ? Этот инструмент работает точно так же.

3. Структура приложения кварков

Базовая структура сгенерированного приложения Quark u соответствует стандарту Maven. Кроме того, есть некоторые дополнительные функции.

Как определено в предыдущем разделе, мы можем заметить, что класс Книжный ресурс был создан в src/main/java вместе с тестовыми классами в src/test/java и src/собственный тест/java . Первые тесты выполняются в режиме JVM, вторые – в собственном режиме. Книжный ресурс доступен для /книг конечная точка и доступна по умолчанию на http://localhost:8080 .

В src/main/docker мы можем найти примеры файлов Dockerfile для запуска нашего приложения в контейнере, либо в JVM, либо в собственном режиме.

Чтобы легко создать приложение, применяется плагин aQuarkus (либо для Maven, либо для Gradle), и импортируется спецификация aQuarkus, чтобы определить, какую версию мы хотим использовать во всем приложении.

В разделе зависимостей нашего файла gradle.build (или pom.xml при использовании Maven), мы можем найти расширения RESTeasy, которые мы определили для генератора, плюс JUnit5 и повторно протестировали наше приложение как в JVM, так и в собственном режиме.

dependencies {
    implementation 'io.quarkus:quarkus-resteasy-jsonb'
    implementation 'io.quarkus:quarkus-resteasy'

    testImplementation 'io.quarkus:quarkus-junit5'
    testImplementation 'io.rest-assured:rest-assured'

    nativeTestImplementation 'io.quarkus:quarkus-junit5'
    nativeTestImplementation 'io.rest-assured:rest-assured'
}

4. JVM против собственного режима

В предыдущем разделе мы несколько раз упоминали JVM и собственные режимы. Необходимо внести некоторые уточнения.

Режим JVM использует стандартную JVM. Он настраивает среду выполнения таким образом, чтобы она включала только то, что действительно нужно приложению, удаляя всю дополнительную динамику стандартной корпоративной среды выполнения. Это приводит к меньшему потреблению памяти, а также к более быстрой фазе загрузки и времени первого отклика по сравнению с традиционным корпоративным приложением.

Режим JVM Quarks уже является значительным преимуществом по сравнению с традиционным корпоративным Java-приложением. На самом деле то, что заставляет кварки сиять, – это их собственный режим. Quarks был разработан на основе философии сначала контейнер с встроенной поддержкой Graal VM и SubstrateVM. При использовании этой модели наши приложения предварительно создаются и компилируются в собственные исполняемые файлы, которые запускаются почти сразу и невероятно эффективны как с точки зрения времени, так и с точки зрения потребления памяти.

В этом уроке мы собираемся запустить приложение и его тесты в режиме JVM. Вместо этого в следующей статье мы увидим, как работает собственный режим.

5. Реализация API REST

Теперь давайте приступим к фактическому этапу разработки. Для нас был создан Книжный ресурс класс. Пришло время реализовать некоторые конечные точки.

Мы собираемся раскрыть две конечные точки:

  • /книги возвращает список книг, доступных в библиотеке;
  • /книги/{идентификатор} возвращает книгу с указанным идентификатором.
@Path("/books")
@Produces(MediaType.APPLICATION_JSON)
public class BookResource {

    @Inject
    BookService bookService;

    @GET
    public List getBooks() {
        return bookService.getBooks();
    }

    @GET
    @Path("{id}")
    public Book getBookById(@PathParam("id") Long id) {
        return bookService.getBookById(id);
    }
}

Интересно отметить, что, в отличие от ванильного JAX-RS, используемого в Jakarta EE, в Quarks нам не нужно определять класс Application с аннотацией @ApplicationPath для включения API REST. Кроме того, по умолчанию класс ресурсов настроен как @ApplicationScoped . Вы можете изменить конфигурацию, используя знакомые аннотации из CDI для определения области действия класса.

Функциональность для извлечения книг делегирована классу Book Service , который вводится в качестве компонента CDI в BookResource . Служба определяет статическую карту для имитации хранилища книг.

@ApplicationScoped
public class BookService {

    private static Map bookRepository = new ConcurrentHashMap<>();

    static {
        bookRepository.put(1L, new Book(1L, "Harry Potter"));
        bookRepository.put(2L, new Book(2L, "The Lord of The Rings"));
        bookRepository.put(3L, new Book(3L, "The Golden Compass"));
    }

    List getBooks() {
        return new ArrayList<>(bookRepository.values());
    }

    Book getBookById(Long id) {
        return bookRepository.get(id);
    }
}

Наконец, класс Книга – это POJO.

public class Book {
    private Long id;
    private String title;

    Book(Long id, String title) {
        this.id = id;
        this.title = title;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

6. Запуск приложения Quartus

Пришло время запустить наше приложение Quark u в первый раз. Готовы к некоторому сверхзвуковому субатомному развертыванию?

Давайте откроем окно терминала и выполним команду:

./gradlew assemble quarkusDev

При использовании Maven мы можем выполнить команду:

./mvnw compile quarkus:dev

Задача quarkusDev (или quarkus:dev при использовании Maven) запускает кварки в режиме разработки. Основной особенностью этого режима является горячее развертывание с фоновой компиляцией, что означает, что мы можем изменять наши исходные файлы (как классы Java, так и ресурсы) во время работы приложения, и изменения автоматически вступят в силу.

При запуске Quarks в режиме разработки по умолчанию включен режим отладки, прослушивающий порт 5005 без приостановки JVM.

Теперь давайте проверим, работает ли это. Из терминала давайте вызовем наш совершенно новый REST API:

curl http://localhost:8080/books/1

Это и есть результат:

{"id":1,"title":"Harry Potter"}

Отлично, это работает!

7. Тестирование

Мы вручную проверили, что наши конечные точки REST правильно отображаются в нашем приложении Quarks, но лучше написать несколько автотестов.

Давайте используем класс Book Resource Test в src/test/java , который уже был создан для нас, и давайте напишем пару тестов для двух конечных точек, предоставляемых классом BookResource . Как упоминалось ранее, мы собираемся использовать JUnit 5 и Будьте уверены писать наши тесты.

@QuarkusTest
public class BookResourceTest {

    @Test
    void testGetBooks() {
        given()
            .when().get("/books")
            .then()
                .statusCode(200)
                .body("id", hasItems(1, 2, 3));
    }

    @Test
    void testGetBookById() {
        given()
          .pathParam("id", 1)
          .when().get("/books/{id}")
          .then()
             .statusCode(200)
             .body("id", is(1));
    }
}

Аннотация @QuarkusTest гарантирует, что приложение запущено перед запуском тестов.

Тесты могут выполняться либо непосредственно с нашей СТОРОНЫ, либо с помощью нашего инструмента сборки. Если мы используем Gradle:

./gradlew test

Вместо этого с помощью Maven мы выполняем следующую команду:

./mvnw test

Супер! Теперь у нас также есть автотесты, гарантирующие, что наше приложение работает должным образом.

Вывод

В этой статье мы впервые взглянули на кварки. Мы изучили различные способы создания базового проекта Quarks и рассмотрели его структуру, чтобы определить все основные части приложения. Затем мы внедрили простое приложение RESTful, использующее знакомые API-интерфейсы JAX-RS и CDI для корпоративной Java, и научились запускать приложение Quarkus в режиме разработки. Наконец, мы убедились, что приложение было реализовано правильно, написав несколько автотестов и научившись их запускать.

Quarks определенно останется здесь, и я с нетерпением жду возможности увидеть, как это изменит ландшафт корпоративных приложений Java. А вы? Дайте мне знать, что вы думаете о кварках и планируете ли вы начать использовать их в своих будущих проектах.

Вам понравилась эта статья? Ознакомьтесь с моим личным блогом для получения дополнительной информации: thomasvitale.com . Я пишу о корпоративной Java, Spring, Keycloak и безопасности приложений.

Оригинал: “https://dev.to/thomasvitale/quarkus-develop-your-first-supersonic-enterprise-java-application-4c9f”