Существует множество материалов по микросервисам, просто 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:
- Два сервиса в этом Compose определяются именем
db
иweb
атрибутами - Имя изображения для каждого сервиса, определенного с помощью атрибута
image
- Изображение
arungupta/couchbase:travel
запускает сервер Couchbase, конфигурирует его с помощью API-интерфейса REST Couchbase и загружаетarungupta/couchbase:travel
~ 32k документов JSON. - Изображение
arungupta/couchbase-javaee:travel
запускает WildFly и развертывает файл WAR приложения, созданный по адресу https://github.com/arun-gupta/couchbase-javaee . Клонируйте этот проект, если вы хотите создать свой собственный имидж. - Атрибут
envrionment
определяет переменные среды, доступные приложению, развернутому в WildFly.COUCHBASE_URI
ссылается на службу базы данных. Это используется в коде приложения, как показано на https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java . - Переадресация портов достигается с помощью атрибута
ports
-
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 . Он выполняет следующие проверки:- Ведро существует
- Служба запросов Couchbase запущена и работает
- Образец ведро полностью загружен
Это приложение можно запустить с помощью команды 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 в контейнерах?
Ссылка: | Микросервис с использованием развертывания стека Docker — WildFly, Java EE и Couchbase от нашего партнера по JCG Аруна Гупта в блоге Miles to go 3.0… . |