Статьи

Предоставляемые пользователем экземпляры сервисов: используйте их!

В Cloud Foundry v2 и Stackato 3 есть функция, которую многие, похоже, упускают. Предоставленные пользователем экземпляры службы позволяют хранить информацию и учетные данные подключения службы с использованием тех же переменных среды в формате JSON, которые создаются системными службами при привязке службы к приложению.

Короче говоря, это самый простой из возможных способов подключения приложений, работающих на Stackato, к * существующим * службам данных. Введите строки подключения с помощью клиента ‘stackato’, затем привяжите полученный экземпляр службы к вашему приложению.

Функция — это функция, независимо от того, насколько она мала.

Многие системы PaaS используют переменные среды для настройки конфигурации и подключения приложений к сервисам. Хранение конфигурации в среде является третьим фактором в подходе двенадцатифакторного приложения.

Система привязки базы данных была в Cloud Foundry с самого начала, и, к счастью, кто-то в Pivotal заметил некоторые незаметные плоды при планировании и внедрении Cloud Foundry v2.

Поскольку модель привязки экземпляра службы уже существует, было относительно просто дать пользователям возможность указать произвольные пары ключ-значение из клиента CLI и позволить им подключать свои приложения. Stackato унаследовал это в версии 3.0 с переходом на базу кода v2.

Как сервисы связаны с приложениями

Когда вы отправляете приложение в Stackato, вы можете запросить для него службу данных. Вот пример в формате stackato.yml:

  name: cirrus
  mem: 256M
  instances: 2
  services:
      cirrusdb: mysql - See more at: 

Наше приложение под названием Cirrus запрашивает 256 МБ памяти приложения для каждого из двух экземпляров (Docker-контейнеров). Он также запрашивает базу данных MySQL, которую создаст Stackato. Имя пользователя Stackato для этого экземпляра службы — ‘cirrusdb’, но это не * фактическое * имя базы данных в MySQL. В зависимости от того, как реализована системная служба, может потребоваться, чтобы имя базы данных было глобально уникальным, поэтому обычно информация о соединении для экземпляра службы, такого как cirrusdb, может выглядеть примерно так:

  host: 192.168.68.18
  name: dd8b072e1950844aa8af62911132898a5
  password: pQaVO9oAd6dJR
  port: 3306
  user: uIcTojXrnLWyE


Служба * instance * на самом деле является просто дескриптором объекта JSON со всей * реальной * информацией, необходимой приложению для подключения к базе данных.
Эта информация предоставляется внутри экземпляров приложения с помощью переменных среды, таких как VCAP_SERVICES:

   $ echo $VCAP_SERVICES | json
  {
    "mysql": [
      {
        "name": "cirrusdb",
        "label": "mysql-5.5",
        "tags": [],
        "plan": "free",
        "credentials": {
          "name": "dd8b072e1950844aa8af62911132898a5",
          "hostname": "192.168.68.18",
          "host": "192.168.68.18",
          "port": 3306,
          "user": "uZ3e0I7b3w578",
          "username": "uZ3e0I7b3w578",
          "password": "p0IOGF5wYA337",
          "uri": "mysql://uZ3e0I7b3w578:[email protected]:3306/dd8b072e1950844aa8af62911132898a5",
          "jdbcUrl": "jdbc:mysql://uZ3e0I7b3w578:[email protected]:3306/dd8b072e1950844aa8af62911132898a5"
        }
      }
    ]
  }

… и немного проще STACKATO_SERVICES:

  $ echo $STACKATO_SERVICES | json
  {
    "cirrusdb": {
      "name": "dd8b072e1950844aa8af62911132898a5",
      "hostname": "192.168.68.18",
      "host": "192.168.68.18",
      "port": 3306,
      "user": "uZ3e0I7b3w578",
      "username": "uZ3e0I7b3w578",
      "password": "p0IOGF5wYA337",
      "uri": "mysql://uZ3e0I7b3w578:[email protected]:3306/dd8b072e1950844aa8af62911132898a5",
      "jdbcUrl": "jdbc:mysql://uZ3e0I7b3w578:[email protected]:3306/dd8b072e1950844aa8af62911132898a5"
    }
  }

Приложение может проанализировать одну из этих переменных (или даже более краткие переменные _URL), чтобы подключиться к базе данных. Просто.

Но как мне подключиться к производственной БД?

Все вышеперечисленное прекрасно работает, если вы используете Stackato для постоянной подготовки всех баз данных, но многие люди уже имеют данные в существующих производственных базах данных. Для подключения приложений, размещенных в Stackato, к этим системам, использовавшимся (в течение 2.x дней), необходимо вручную указать дополнительные переменные среды в контейнерах приложения и добавить дополнительные тесты / анализ в код приложения.

Это сработало, но не очень элегантно. Это было не намного лучше, чем жестко закодированные строки соединения, которых мы призывали избегать.

Теперь есть лучший способ сохранить эти строки подключения.

Скажем, у нас есть большой кластер MySQL высокой доступности в нашей сети. Наши производственные данные уже есть, и мне дали учетные данные для подключения соответствующей базы данных с определенным именем пользователя и паролем. Администратор Stackato позаботился о том, чтобы узлы DEA в нашем кластере Stackato могли маршрутизировать к хосту, который балансирует нагрузку в кластере БД.

Я беру данные о подключении, которые мне дали, и ввожу их как предоставленный пользователем экземпляр службы, используя клиент stackato:

 $ stackato create-service user-provided cirrusdb-prod-live Which credentials to use for connections [hostname, port, password]: hostname, port, name, user, password hostname: bigdb.int.example.com port: 3306 name: cirrusdb-prod user: cirrus-web-ro password: n63uYdetMH8qAkysoL Creating new service ... OK 

Теперь у нас есть «экземпляр службы» под названием «cirrusdb-prod-live», поэтому мы можем поменять нашу тестовую базу данных:
 $ stackato unbind-service cirrusdb cirrus Unbinding cirrusdb from cirrus ... ... 

… для одного с живыми данными в нем:
 $ stackato bind-service cirrusdb-prod-live cirrus Binding cirrusdb-prod-live to cirrus ... 

Мое приложение получит информацию о соединении из VCAP_SERVICES или STACKATO_SERVICES и начнет использовать живые данные.

Не только для баз данных.

Поскольку вы управляете ключами и значениями, сохраненными в экземпляре службы, вы можете использовать его для подключения приложения к * любому * типу службы, для которой требуется строка подключения или учетные данные (например, SMTP-сервер, интерфейс REST, очередь сообщений) ,

Пока у вашего приложения есть библиотеки, необходимые для подключения к службе, и Stackato может маршрутизировать к конечной точке службы (хосту), все готово.


Если вы хотите попробовать Stackato для себя, вы можете бесплатно загрузить микро-облако или запросить доступ к песочнице Stackato на пробный период.