Статьи

WildFly Swarm: создание микросервисов с помощью Java EE

«Совершенство достигается не тогда, когда нечего добавить, а когда нечего убрать» Антуан де Сент-Экзюпери

Эта цитата французского писателя Антуана де Сент-Экзюпери была сделана, чтобы доказать, что часто меньше значит больше. Это верно для архитектора, художника, дизайнера, писателя, работающего, разработчика программного обеспечения или любой другой профессии. Простота, минимализм, срезание суеты всегда проходит долгий путь и имеет ряд преимуществ по сравнению с чем-то раздутым.

Что такое WildFly Swarm?

WildFly — это легкий, гибкий, многофункциональный сервер приложений, совместимый с Java EE 7. WildFly 9 даже представил 27-мегабайтный сервлет-дистрибутив . Они очень хорошо подходят для вашего предприятия и веб-приложений.

WildFly Swarm занимает немного выше. Из объявления :

WildFly Swarm — это новый проект коляски, поддерживающий WildFly 9.x, который позволяет деконструировать WildFly AS и вставлять достаточно его вместе с вашим приложением для создания автономного исполняемого фляги. WildFly Swarm

Типичная модель разработки приложения для приложения Java EE — создать архив EAR или WAR и развернуть его на сервере приложений. Все зависимости, такие как реализации Java EE, упакованы на сервере приложений и обеспечивают функциональность, требуемую классами приложений. Можно развернуть несколько архивов, и все они используют одни и те же библиотеки. Это хорошо понятная модель, которая использовалась в течение последних нескольких лет.

WildFly Swarm переворачивает таблицу, где создает «толстую банку», в которой все зависимости упакованы в файл JAR. Это включает в себя минималистскую версию WildFly, любые необходимые зависимости и, конечно же, сам код приложения. Приложение можно просто запустить с помощью java -jar .

Каждый толстый сосуд может быть микросервисом, который затем может самостоятельно модернизироваться, заменяться или масштабироваться. Каждый жирный кувшин обычно будет следовать принципу единой ответственности и, таким образом, будет упакован только требуемые зависимости. Каждый JAR может использовать постоянство полиглота и использовать только необходимый механизм сохранения.

Покажи мне код!

Приложение Java EE можно упаковать в виде толстой банки WildFly Swarm, добавив зависимость Maven и плагин. Полный исходный код для простого образца JAX-RS доступен по адресу github.com/arun-gupta/wildfly-samples/tree/master/swarm .

WildFly Swarm Maven Dependency

Добавьте следующую зависимость Maven в pom.xml :

1
2
3
4
5
6
<dependency>
    <groupId>org.wildfly.swarm</groupId>
    <artifactId>wildfly-swarm-jaxrs</artifactId>
    <version>${version.wildfly-swarm}</version>
    <scope>provided</scope>
</dependency>

Плагин WildFly Swarm Maven

Добавьте следующий плагин Maven в pom.xml :

01
02
03
04
05
06
07
08
09
10
11
12
13
<plugin>
    <groupId>org.wildfly.swarm</groupId>
    <artifactId>wildfly-swarm-plugin</artifactId>
    <version>${version.wildfly-swarm}</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>create</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Создать WildFly Swarm Fat Jar

Жирную банку можно легко создать, вызвав стандартную цель Maven:

1
maven package

Это создает файл JAR с использованием обычных соглашений Maven и добавляет -swarm в конце. Имя сгенерированного файла WAR в нашем примереswarm-1.0-SNAPSHOT-swarm.jar .

Сгенерированный файл WAR имеет размер ~ 30 МБ, имеет 134 JAR (все в m2repo ) и 211 классов. Код приложения находится в app/swarm-1.0-SNAPSHOT.war .

Run WildFly Swarm Fat Jar

Эта дальняя банка может быть запущена как:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
swarm> java -jar target/swarm-1.0-SNAPSHOT-swarm.jar
12:27:10,622 INFO  [org.jboss.msc] (main) JBoss MSC version 1.2.4.Final
12:27:10,739 INFO  [org.jboss.as] (MSC service thread 1-6) WFLYSRV0049: WildFly Core 1.0.0.CR1 "Kenny" starting
2015-05-06 12:27:11,185 INFO  [org.jboss.as.security] (ServerService Thread Pool -- 11) WFLYSEC0002: Activating Security Subsystem
2015-05-06 12:27:11,189 INFO  [org.jboss.as.security] (MSC service thread 1-10) WFLYSEC0001: Current PicketBox version=4.9.0.Beta2
2015-05-06 12:27:11,194 INFO  [org.wildfly.extension.io] (ServerService Thread Pool -- 13) WFLYIO001: Worker 'default' has auto-configured to 16 core threads with 128 task threads based on your 8 available processors
2015-05-06 12:27:11,199 INFO  [org.jboss.as.naming] (ServerService Thread Pool -- 12) WFLYNAM0001: Activating Naming Subsystem
2015-05-06 12:27:11,246 INFO  [org.jboss.as.naming] (MSC service thread 1-12) WFLYNAM0003: Starting Naming Service
2015-05-06 12:27:11,319 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-8) WFLYUT0003: Undertow 1.2.4.Final starting
2015-05-06 12:27:11,319 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 14) WFLYUT0003: Undertow 1.2.4.Final starting
2015-05-06 12:27:11,337 INFO  [org.xnio] (MSC service thread 1-7) XNIO version 3.3.1.Final
2015-05-06 12:27:11,343 INFO  [org.xnio.nio] (MSC service thread 1-7) XNIO NIO Implementation Version 3.3.1.Final
2015-05-06 12:27:11,369 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-13) WFLYUT0012: Started server default-server.
2015-05-06 12:27:11,409 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-8) WFLYUT0006: Undertow HTTP listener default listening on /127.0.0.1:8080
2015-05-06 12:27:11,543 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Core 1.0.0.CR1 "Kenny" started in 855ms - Started 64 of 70 services (13 services are lazy, passive or on-demand)
2015-05-06 12:27:11,570 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0027: Starting deployment of "swarm-1.0-SNAPSHOT.war" (runtime-name: "swarm-1.0-SNAPSHOT.war")
2015-05-06 12:27:11,724 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-1) WFLYUT0018: Host default-host starting
2015-05-06 12:27:11,906 INFO  [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-14) Deploying javax.ws.rs.core.Application: class org.wildfly.samples.swarm.MyApplication
2015-05-06 12:27:11,923 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-14) WFLYUT0021: Registered web context: /
2015-05-06 12:27:11,944 INFO  [org.jboss.as.server] (main) WFLYSRV0010: Deployed "swarm-1.0-SNAPSHOT.war" (runtime-name : "swarm-1.0-SNAPSHOT.war")

Ответ может быть проверен как:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
target> curl -v http://127.0.0.1:8080/resources/resource
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /resources/resource HTTP/1.1
> User-Agent: curl/7.37.1
> Host: 127.0.0.1:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< Content-Type: application/octet-stream
< Content-Length: 12
< Date: Wed, 06 May 2015 19:29:10 GMT
<
* Connection #0 to host 127.0.0.1 left intact
hello swarm!

Блог WildFly Swarm Release включает множество блогов о сервлете , JAX-RS с ShrinkWrap , источнике данных через развертывание , обмене сообщениями и JAX-RS и многом другом.

WildFly Swarm Следующие шаги

Это всего лишь версия 1.0.0.Alpha1, поэтому не стесняйтесь опробовать образцы и оставить отзыв, сообщив о проблеме .

Вы обладаете мощью всех подсистем WildFly и даже можете создать встраиваемый контейнер Java EE, как показано в блоге выпуска :

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
public class Main {
 
    public static void main(String[] args) throws Exception {
        Container container = new Container();
 
        container.subsystem(new MessagingFraction()
                        .server(
                                new MessagingServer()
                                        .enableInVmConnector()
                                        .topic("my-topic")
                                        .queue("my-queue")
                        )
        );
 
        // Start the container
        container.start();
 
        JaxRsDeployment appDeployment = new JaxRsDeployment();
        appDeployment.addResource(MyResource.class);
 
        // Deploy your JAX-RS app
        container.deploy(appDeployment);
 
        // Create an MSC deployment
        ServiceDeployment deployment = new ServiceDeployment();
        deployment.addService(new MyService("/jms/topic/my-topic" ) );
 
        // Deploy the services
        container.deploy( deployment );
    }
}

Последующие блоги покажут, как легко создать микросервис с помощью WildFly Swarm.

WildFly Swarm Оставайтесь на связи

Вы можете идти в ногу с проектом через комнату WildFly HipChat , @wildflyswarm в Твиттере или через GitHub Issues .