Статьи

Развертывание приложения akka-http в Cloud Foundry

В предыдущем посте я описал шаги по развертыванию простого приложения akka-http в Cloud Foundry. Суть его заключалась в том, что до тех пор, пока есть способ создать работоспособный толстый (uber) jar, развертывание очень простое — Java buildpack пакета Cloud Foundry может взять биты и подключить все необходимое для его запуска в облаке Литейная среда.

Здесь я хотел бы перейти к более сложному сценарию — здесь приложение имеет зависимость от внешней базы данных, скажем, от базы данных MySQL.

В локальной среде детали базы данных были бы разрешены с использованием конфигурации, обычно указанной следующим образом:

1
2
3
4
5
sampledb = {
  url = "jdbc:mysql://localhost:3306/mydb?useSSL=false"
  user = "myuser"
  password = "mypass"
}

Если база данных Mysql должна находиться за пределами среды Cloud Foundry, этот подход определения конфигурации базы данных будет продолжать работать хорошо. Однако, если служба находится в
Облачный литейный рынок , затем информация о сервисе создается динамически во время привязки к приложению.

Просто, чтобы сделать это немного более конкретным, в моем местном PCF Dev у меня есть торговая площадка с доступной услугой p-mysql.

И если бы я должен был создать «экземпляр службы» из этого:

и привязать этот экземпляр к приложению:

по сути, в этот момент происходит то, что у приложения есть переменная окружения VCAP_SERVICES, доступная для него, и ее необходимо проанализировать, чтобы получить кредиты БД. VCAP_SERVICES в текущем сценарии выглядит примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "p-mysql": [
   {
    "credentials": {
     "hostname": "mysql-broker.local.pcfdev.io",
     "jdbcUrl": "jdbc:mysql://mysql-broker.local.pcfdev.io:3306/myinstance?user=user\u0026password=pwd",
     "name": "myinstance",
     "password": "pwd",
     "port": 3306,
     "uri": "mysql://user:[email protected]:3306/myinstance?reconnect=true",
     "username": "user"
    },
    "label": "p-mysql",
    "name": "mydb",
    "plan": "512mb",
    "provider": null,
    "syslog_drain_url": null,
    "tags": [
     "mysql"
    ]
   }
  ]
 }

Это можно легко проанализировать с помощью конфигурации Typesafe, пример (по общему признанию хакерского) кода выглядит так:

01
02
03
04
05
06
07
08
09
10
def getConfigFor(serviceType: String, name: String): Config = {
    val vcapServices = env("VCAP_SERVICES")
    val rootConfig = ConfigFactory.parseString(vcapServices)
    val configs = rootConfig.getConfigList(serviceType).asScala
      .filter(_.getString("name") == name)
      .map(instance => instance.getConfig("credentials"))
 
    if (configs.length > 0) configs.head
    else ConfigFactory.empty()
  }

и называется следующим образом:

1
val dbConfig = cfServicesHelper.getConfigFor("p-mysql", "mydb")

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

Проще всего проследить за всем этим, можно посмотреть пример кода, доступного в моем репозитории github, здесь — https://github.com/bijukunjummen/sample-akka-http-rest.

Ссылка: Развертывание приложения akka-http в Cloud Foundry от нашего партнера по JCG Биджу Кунджуммен в блоге all and sundry