Этот блог покажет, как простое Java-приложение может взаимодействовать с базой данных с помощью обнаружения служб в DC / OS.
Почему сервис Discovery?
Приложение обычно состоит из нескольких компонентов, таких как сервер приложений, база данных, веб-сервер, сервер кэширования и обмена сообщениями. Как правило, несколько реплик каждого компонента будут запускаться в зависимости от потребностей вашего приложения. Развертывание этого приложения с использованием инфраструктуры оркестровки контейнеров означает, что каждая реплика будет работать как контейнер. Таким образом, приложение обычно развертывается как мультиконтейнерное приложение.
Каждому контейнеру присваивается уникальный IP-адрес для его срока службы. Но контейнеры эфемерны и могут завершаться и переназначаться на другом хосте с помощью структуры оркестровки. В этом случае контейнеру обычно назначается другой IP-адрес. Это означает, что приложение, развернутое на сервере приложений, не может полагаться на IP-адрес базы данных. Здесь требуется обнаружение службы.
Таким образом, нескольким репликам компонента присваивается логическое имя. Например, web для всех контейнеров сервера приложений и db для всех контейнеров базы данных. Теперь приложение может общаться с контейнерами базы данных, используя логическое имя службы. Это позволяет перепланировать контейнеры базы данных в любом месте кластера, а также динамически увеличивать и уменьшать их.
Давайте посмотрим, как это можно сделать в DC / OS с одним экземпляром сервера приложений и сервера базы данных. Этот блог будет использовать WildFly для сервера приложений и Couchbase для базы данных.
Couchbase Cluster на Mesos с DC / OS предоставляет более подробную информацию о том, как настроить кластер Couchbase на DC / OS.
Этот блог будет использовать следующие основные шаги:
- Настройка DC / OS Cluster
- Определение марафона
- Разверните приложение
Полный исходный код, используемый в этом блоге, находится по адресу github.com/arun-gupta/dcos-java-database .
Большое спасибо @unterstein за создание плагина Maven и за то, что он помог мне понять внутреннюю работу DC / OS.
Настройка DC / OS Cluster
Кластер DC / OS можно легко создать с помощью шаблона CloudFormation . Подробные инструкции, включая системные требования, снимки экрана и настройку, доступны в разделе Установка DC / OS на AWS .
Вывод CloudFormation выглядит так, как показано:
Запишите значение, показанное для ключей DnsAddress и PublicSlaveDnsAddress . Значение первого ключа может использоваться для доступа к графическому интерфейсу DC / OS и выглядит следующим образом:
Настройте интерфейс командной строки DC / OS, как описано в разделе Интерфейс командной строки . Короче говоря, используются следующие команды:
-
dcos config set core.dcos_url http://${DnsAddress}Замените${DnsAddress}на соответствующее значение из вывода CloudFormation. -
dcos auth login -
dcos config show core.dcos_acs_token. Если это еще не сделано, клонируйте репозиторий из github.com/arun-gupta/dcos-java-database . Создайте новый файл.dcos-tokenи скопируйте вывод команды из этого файла. -
dcos package install marathon-lb
Определение приложения марафона
Фреймворк Marathon используется для планирования контейнеров в DC / OS. Приложение марафона может быть определено путем предоставления определения приложения .
Как упоминалось ранее, этот блог покажет, как простое Java-приложение может общаться с базой данных. Мы будем использовать приложение Java EE, развернутое в WildFly, и использовать Couchbase в качестве базы данных. Определение приложения выглядит так:
|
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
|
{ "id":"/webapp", "apps":[ { "id":"database", "cpus":4, "mem":4096, "instances":1, "container":{ "type":"DOCKER", "docker":{ "image":"arungupta/couchbase:travel", "network":"USER" } }, "ipAddress":{ "networkName":"dcos" } }, { "id":"web", "dependencies":[ "/webapp/database" ], "cpus":2, "mem":4096, "instances":1, "container":{ "type":"DOCKER", "docker":{ "image":"arungupta/wildfly-couchbase-javaee:travel", "network":"USER", "portMappings":[ { "hostPort":0, "containerPort":8080, "protocol":"tcp" } ] } }, "ipAddress":{ "networkName":"dcos" }, "env":{ "COUCHBASE_URI":"database-webapp.marathon.containerip.dcos.thisdcos.directory" }, "labels":{ "HAPROXY_0_VHOST":"DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com", "HAPROXY_GROUP":"external" } } ]} |
Каковы ключевые моменты в этом определении приложения?
- Приложение имеет два контейнера:
databaseиweb. Веб-контейнер зависит от контейнера базы данных, определенного с помощью атрибутаdependencies. - контейнер
databaseиспользуетarungupta/couchbase:travelизображение Docker дляarungupta/couchbase:travel. Это изображение создано с сайта github.com/arun-gupta/couchbase-javaee/tree/master/couchbase . Он использует базовый образ Couchbase и REST API Couchbase для предварительной настройки базы данных. Образец корзины также загружается в базу данных. -
webконтейнер используетarungupta/wildfly-couchbase-javaee:travelизображениеarungupta/wildfly-couchbase-javaee:travel. Это изображение создано из github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile . Это приложение Java EE 7, включенное в WildFly. Приложение используетCOUCHBASE_URIв качестве переменной среды для подключения к базе данных Couchbase. Значение этой переменной среды настроено на использование обнаружения службы DNS и определяется, как описано в Виртуальных сетях .
Обязательно измените значение HAPROXY_0_VHOST чтобы оно соответствовало значению ${PublicSlaveDnsAddress} из вывода CloudFormation. Метка HAPROXY_0_VHOST инструктирует Marathon-LB выставить контейнер Docker, в нашем случае сервер приложений WildFly, на внешний балансировщик нагрузки с виртуальным хостом. Значение 0 в ключе метки соответствует индексу servicePort, начиная с 0. Если у вас было несколько определений servicePort, вы бы повторяли их как 0, 1, 2 и т. Развертывание приложения с внутренней и внешней балансировкой нагрузки с помощью marathon-lb предоставляет более подробную информацию о настройке marathon-lb.
Обнаружение служб и балансировка нагрузки предоставляют более подробную информацию об обнаружении служб и распределении нагрузки в DC / OS.
Разверните приложение с помощью Maven
Приложение может быть развернуто с помощью dcos-maven-plugin .
Плагин выглядит так:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<plugin> <groupId>dcos</groupId> <artifactId>dcos-maven-plugin</artifactId> <version>0.2</version> <configuration> <deployable>group</deployable> <ignoreSslCertificate>true</ignoreSslCertificate> </configuration> <executions> <execution> <id>dcos:deploy</id> <phase>install</phase> <goals> <goal>deploy</goal> </goals> </execution> </executions></plugin> |
Основные моменты в этом фрагменте:
- Версия плагина — 0.2. Это указывает на то, что плагин все еще находится на ранней стадии разработки.
-
dcosUrl— это значение ключа${DnsAddress}из вывода CloudFormation. Этот адрес используется для развертывания приложения. - Элемент
<deployable>включает различные типы развертывания — приложение, группа или модули. Этот элемент является подсказкой для плагина и, вероятно, должен исчезнуть в будущей версии по мере консолидации Marathon API. Следуйте № 11 для более подробной информации.
Другие детали и конфигурация о плагине находятся на dcos-maven-plugin .
Разверните приложение:
|
1
|
mvn install |
Следующий вывод показан:
|
1
2
3
4
5
6
7
8
|
[INFO] --- dcos-maven-plugin:0.2:deploy (dcos:deploy) @ dcos-java-database ---[INFO] About to execute DC/OS deploy[INFO] app definition: /Users/arungupta/workspaces/dcos-java-database/app-definition.json[INFO] dcos token: /Users/arungupta/workspaces/dcos-java-database/.dcos-token[INFO] dcos url: http://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/[INFO] ignore ssl certificate: true[INFO] deployable: group[INFO] Response from DC/OS [200] {"version":"2017-03-07T13:27:49.970Z","deploymentId":"dbc80f96-28cb-4040-8d0d-78452e461ec1"} |
Вот некоторые из обновленных выводов с консоли DC / OS.
Первая обновленная вкладка Сервисы:

Приложение базы данных имеет одну задачу:

Журналы из базы данных задачи:

Он показывает выходные данные из Couchbase REST API для настройки сервера.
Это показывает, что приложение Java EE успешно развернуто.
Доступ к приложению:
|
1
|
curl http://DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com/airlines/resources/airline |
Адрес — это значение ключа ${PublicSlaveDnsAddress} из вывода CloudFormation. Форматированный вывод, например, с помощью jq , выглядит следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[ { "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", . . . "icao": "RLA", "id": 1203, "type": "airline" } }] |
Это оно!
Как упоминалось ранее, полный исходный код, используемый в этом блоге, находится по адресу github.com/arun-gupta/dcos-java-database .
Этот блог показал, как простое Java-приложение может взаимодействовать с базой данных с помощью обнаружения служб в DC / OS.
Для получения дополнительной информации проверьте:
- Документы DC / OS
- Couchbase на контейнерах
- Портал разработчиков Couchbase
- Задавайте вопросы на форумах Couchbase или переполнении стека
- Скачать Couchbase
| Ссылка: | Обнаружение службы с помощью Java и приложения базы данных в DC / OS от нашего партнера по JCG Аруна Гупта в блоге Miles to go 3.0… . |





