Этот блог покажет, как простое 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… . |