В предыдущем посте я описал шаги по развертыванию простого приложения 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 , "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 |