Статьи

Микросервис с использованием развертывания стека Docker — WildFly, Java EE и Couchbase

Существует множество материалов по микросервисам, просто Google ! Пару лет назад я провел презентацию о рефакторинге монолита для микросервисов в Devoxx Belgium, и у него есть хорошие отзывы:

Этот блог покажет, как Docker упрощает создание и закрытие микросервиса.

Весь код, используемый в этом блоге, находится по адресу github.com/arun-gupta/couchbase-javaee .

Определение микросервиса с использованием Compose

Docker 1.13 представил версию Docker Compose версии 3 . Изменения в синтаксисе минимальны, но ключевым отличием является добавление атрибута deploy . Этот атрибут позволяет указать реплики, обновляемое обновление и политику перезапуска для контейнера.

Наш микросервис запустит сервер приложений WldFly с предварительно развернутым приложением Java EE. Это приложение будет общаться с базой данных Couchbase для данных приложения CRUD.

Вот определение Compose:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
version: '3'
services:
  web:
    image: arungupta/couchbase-javaee:travel
    environment:
      - COUCHBASE_URI=db
    ports:
      - 8080:8080
      - 9990:9990
    depends_on:
      - db
  db:
    image: arungupta/couchbase:travel
    ports:
      - 8091:8091
      - 8092:8092
      - 8093:8093
      - 11210:11210

В этом файле Compose:

  1. Два сервиса в этом Compose определяются именем db и web атрибутами
  2. Имя изображения для каждого сервиса, определенного с помощью атрибута image
  3. Изображение arungupta/couchbase:travel запускает сервер Couchbase, конфигурирует его с помощью API-интерфейса REST Couchbase и загружает arungupta/couchbase:travel ~ 32k документов JSON.
  4. Изображение arungupta/couchbase-javaee:travel запускает WildFly и развертывает файл WAR приложения, созданный по адресу https://github.com/arun-gupta/couchbase-javaee . Клонируйте этот проект, если вы хотите создать свой собственный имидж.
  5. Атрибут envrionment определяет переменные среды, доступные приложению, развернутому в WildFly. COUCHBASE_URI ссылается на службу базы данных. Это используется в коде приложения, как показано на https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java .
  6. Переадресация портов достигается с помощью атрибута ports
  7. depends_on в файле определения Compose обеспечивает порядок запуска контейнера. Но запуск на уровне приложений должен обеспечиваться приложениями, работающими внутри контейнера. В нашем случае WildFly запускается довольно быстро, но для запуска базы данных требуется несколько секунд. Это означает, что приложение Java EE, развернутое в WildFly, не может связываться с базой данных. Это описывает лучшие практики при создании приложений микро-сервисов: вы должны защищаться от кода и при инициализации приложения убедиться, что микро-сервисы, от которых вы зависите, были запущены, не предполагая порядок запуска. Это показано в коде инициализации базы данных по адресу https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java . Он выполняет следующие проверки:

    1. Ведро существует
    2. Служба запросов Couchbase запущена и работает
    3. Образец ведро полностью загружен

Это приложение можно запустить с помощью команды docker-compose up -d на одном хосте. Или кластер движков Docker в режиме роя с помощью команды docker stack deploy .

Настройка Docker Swarm-mode

Инициализируйте режим Swarm, используя следующую команду:

1
docker swarm init

Это запускает Swarm Manager. По умолчанию узел менеджера также рабочий, но его можно настроить только для менеджера.

Найдите некоторую информацию об этом кластере с одним узлом, используя команду docker info command:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 17
Server Version: 1.13.0
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host ipvlan macvlan null overlay
Swarm: active
 NodeID: 92mydh0e09ba5hx3wtmcmvktz
 Is Manager: true
 ClusterID: v68ikyaff7rdxpaw1j0c9i60s
 Managers: 1
 Nodes: 1
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 3
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
 Node Address: 192.168.65.2
 Manager Addresses:
  192.168.65.2:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e
runc version: 2f7393a47307a16f8cee44a37b262e8b81021e3e
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.9.5-moby
Operating System: Alpine Linux v3.5
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.952 GiB
Name: moby
ID: SGCM:KDRD:G3M7:PZHN:J4RL:VFFR:G2SR:EKD5:JV4J:RL3X:LF7T:XF6V
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 31
 Goroutines: 124
 System Time: 2017-01-27T08:25:58.032295342Z
 EventsListeners: 1
No Proxy: *.local, 169.254/16
Username: arungupta
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

Этот кластер имеет 1 узел, и это менеджер.

Кроме того, кластер с несколькими узлами можно легко настроить с помощью Docker для AWS .

Развернуть Микросервис

Микросервис может быть запущен как:

1
docker stack deploy --compose-file=docker-compose.yml webapp

Это показывает вывод:

1
2
3
Creating network webapp_default
Creating service webapp_web
Creating service webapp_db

Сервисы WildFly и Couchbase запускаются на этом узле. Каждый сервис имеет один контейнер. Если режим Swarm включен на нескольких узлах, контейнеры будут распределены по нескольким узлам.

Новая оверлейная сеть создана. Это позволяет нескольким контейнерам на разных хостах связываться друг с другом.
Убедитесь, что службы WildFly и Couchbase работают с помощью docker service ls :

1
2
3
ID            NAME        MODE        REPLICAS  IMAGE
a9pkiziw3vgw  webapp_db   replicated  1/1       arungupta/couchbase:travel
hr5s6ue54kwj  webapp_web  replicated  1/1       arungupta/couchbase-javaee:travel

Журналы для службы можно увидеть, используя docker service logs -f webapp_web :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
webapp_web.1.wby0b04t7bap@moby    | =========================================================================
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    |   JBoss Bootstrap Environment
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    |   JBOSS_HOME: /opt/jboss/wildfly
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    |   JAVA: /usr/lib/jvm/java/bin/java
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    |   JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true
webapp_web.1.wby0b04t7bap@moby    |
webapp_web.1.wby0b04t7bap@moby    | =========================================================================
  
. . .
  
webapp_web.1.wby0b04t7bap@moby    | 23:14:15,811 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 34) WFLYSRV0010: Deployed "airlines.war" (runtime-name : "airlines.war")
webapp_web.1.wby0b04t7bap@moby    | 23:14:16,076 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
webapp_web.1.wby0b04t7bap@moby    | 23:14:16,077 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
webapp_web.1.wby0b04t7bap@moby    | 23:14:16,077 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 98623ms - Started 443 of 691 services (404 services are lazy, passive or on-demand)
Обязательно дождитесь показа последнего оператора журнала.

Микросервис доступа

Получите 10 авиакомпаний от микросервиса:

1
curl -v http://localhost:8080/airlines/resources/airline

Это показывает результаты как:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /airlines/resources/airline HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
< Server: WildFly/10
< Content-Type: application/octet-stream
< Content-Length: 1402
< Date: Fri, 03 Feb 2017 17:02:45 GMT
<
* Connection #0 to host localhost left intact
[{"travel-sample":{"country":"United States","iata":"Q5","callsign":"MILE-AIR","name":"40-Mile Air","icao":"MLA","id":10,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"TQ","callsign":"TXW","name":"Texas Wings","icao":"TXW","id":10123,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"A1","callsign":"atifly","name":"Atifly","icao":"A1F","id":10226,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":null,"callsign":null,"name":"Jc royal.britannica","icao":"JRB","id":10642,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"ZQ","callsign":"LOCAIR","name":"Locair","icao":"LOC","id":10748,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"K5","callsign":"SASQUATCH","name":"SeaPort Airlines","icao":"SQH","id":10765,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"KO","callsign":"ACE AIR","name":"Alaska Central Express","icao":"AER","id":109,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":"5W","callsign":"FLYSTAR","name":"Astraeus","icao":"AEU","id":112,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"UU","callsign":"REUNION","name":"Air Austral","icao":"REU","id":1191,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","id":1203,"type":"airline"}}]

Семинар по Docker для разработчиков Java — это практическая лабораторная работа, которая позволяет быстро освоить Docker.

Получить единственный ресурс:

1
curl -v http://localhost:8080/airlines/resources/airline/137

Создайте новый ресурс:

1
curl -v -H "Content-Type: application/json" -X POST -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","type":"airline"}' http://localhost:8080/airlines/resources/airline

Обновить ресурс:

1
curl -v -H "Content-Type: application/json" -X PUT -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","type":"airline","id": "19810"}' http://localhost:8080/airlines/resources/airline/19810

Удалить ресурс:

1
curl -v -X DELETE http://localhost:8080/airlines/resources/airline/19810

Подробный вывод каждой из этих команд находится по адресу github.com/arun-gupta/couchbase-javaee .

Удалить Микросервис

Микросервис можно удалить с помощью команды docker stack rm webapp :

1
2
3
Removing service webapp_web
Removing service webapp_db
Removing network webapp_default

Хотите начать работу с Couchbase? Посмотрите на стартовые наборы Couchbase .

Хотите узнать больше о запуске Couchbase в контейнерах?