В предыдущем посте я описал шаги по развертыванию простого приложения 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:pwd@mysql-broker.local.pcfdev.io: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 |


