Статьи

Обнаружение служб с помощью Java и приложения базы данных в DC / OS

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

Для получения дополнительной информации проверьте: