Статьи

Разработка микросервиса WildFly Swarm: приложение JAX-RS развернуто в Docker-контейнере

WildFly Swarm представляет собой интересный подход к современной тенденции «маленький — это хорошо», который игнорирует традиционные, слишком большие серверы приложений Java EE и вместо этого развертывает автономные исполняемые файлы JAR без необходимости выполнения всего сервера приложений.

Вместо того, чтобы требовать всего стека Java EE, WildFly Swarm позволяет вам выбирать только реализации частей, которые должны выполняться вашей службой. Нужен JAX-RS? Затем включите его через зависимость Maven. Нужен JPA? Потяните это тоже. Любые другие необходимые переходные зависимости автоматически загружаются через Maven. Для загрузки JAX-RS также требуется контейнер сервлетов и API-интерфейсы, но это достигается за счет транзитивных зависимостей Maven. Конечным результатом является автономный упакованный Jar-файл, содержащий все необходимое для запуска с помощью команды java -jar.

Я проводил некоторое время в последнее время, глядя на получение Weblogic Portal 10.3.6 работает в контейнере Docker (проверить мою работу в изменениях прогресса на GitHub здесь ). Поскольку контейнеры EE идут, это большой. Это тяжелый. Если вы хотите описать что-либо как монолит, то это ваш идеальный пример. Так что переключаясь между тем, я хотел перейти к другой крайности и посмотреть, как вы будете создавать легкий сервис на основе Java, и WildfFly Swarm выглядел довольно интересно.

В этом году я присутствовал на одной из сессий на JavaOne, где рассказывал о Swarm, так что я хотел бы взглянуть на него в моем списке задач.

Начать работу с Swarm на самом деле довольно легко, поскольку все это зависит от зависимостей и плагинов Maven. Там же легко следовать учебник здесь . Примеры приложений, показывающих различные компоненты WildFly, упакованные с использованием Swarm, также стоит посмотреть здесь .

Я работал над примерами, собирая приложение helloworld JAX-RS, а также Dockerfile для упаковки и развертывания его в контейнере Docker. На самом деле это было довольно легко, и мое приложение в конечном итоге выглядело как приведенные примеры.

Мой пример ресурса JAX-RS довольно прост, здесь нет ничего сложного:

Если вы ищете различные сервисы WildFly, которые вы можете упаковать в Swarm, просмотр mvnrepository — это хорошее место для быстрого начала работы с mvn deps или просмотра примеров или источников .

Для плагинов Maven War и Wildfly-Storm:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins>/groupId>
      <artifactId>maven-war-plugin>/artifactId>
      <configuration>
      <failOnMissingWebXml>false</failOnMissingWebXml>
      <packagingExcludes>WEB-INF/lib/wildfly-swarm-*.jar>/packagingExcludes>
      </configuration>
    </plugin>
  <plugin>
    <groupId>org.wildfly.swarm</groupId>
    <artifactId>wildfly-swarm-plugin</artifactId>
    <executions>
      <execution>
      <goals>
        <goal>package</goal>
      </goals>
      </execution>
    </executions>
  </plugin>
</plugins>
</build>

Далее добавим зависимость для WildFly Swarm JAX-RS:


<dependency>
    <groupId>org.wildfly.swarm</groupId>
    <artifactId>wildfly-swarm-jaxrs</artifactId>
    <version>1.0.0.Alpha5</version>
</dependency>

Чтобы собрать автономный исполняемый Jar-файл, выполните сборку с помощью пакета mvn — это создаст приложение как обычное целевое устройство, но также включит * -swarm.jar — это автономный Jar-файл, содержащий все зависимости WildFly, и может работать автономно с ‘java -jar helloworld-swarm-0.0.1-SNAPSHOT-swarm.jar’

Сборка Docker Контейнера

Учитывая, что у нас теперь есть простой, отдельный, автономный Jar-файл, его развертывание в контейнере Docker также довольно легко, поскольку у нас нет других зависимостей, о которых нужно беспокоиться (нам просто нужна JVM).

Пример Dockerfile будет выглядеть (прокрутить вправо):


FROM java:openjdk-8-jdk
ADD target/helloworld-swarm-0.0.1-SNAPSHOT-swarm.jar /opt/helloworld-swarm.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/opt/helloworld-swarm.jar"]

Все, что мы здесь делаем, это:
1. Создание образа на основе официального образа openjdk из DockerHub.

2. Добавляем встроенную банку WildFly Swarm, содержащую наше приложение в / opt на изображении

3. Разоблачение порта 8080

4. Определение точки входа, которая выполняется при запуске контейнера

Чтобы создать изображение на основе этого Dockerfile:

docker build -t helloworld .

Чтобы запустить контейнер на основе этого изображения:

docker run -d -p 8080:8080 imageid

… Это создает новый контейнер на основе нового контейнера, запускает его как демон с портом 8080 в контейнере, доступном 8080 на хосте. Готово!

Нажмите URL-адрес нашей конечной точки, используя IP-адрес работающей Docker-Machine:

Чтобы просмотреть журналы работающего контейнера, выполните:

docker logs -f containerid

В этом случае вы видите вывод при запуске контейнера сервлета WildFly Undertow и инициализируете наше приложение на основе JAX-RS:

Довольно просто! У нас есть минимальный WildFly-сервер, который запускается внутри контейнера Docker примерно за 10 секунд, а наше приложение разворачивается за 2 секунды. Это очень хорошо, если вы спросите меня.