在前面的文章中,我已经走了过来的步骤来部署一个简单的阿卡-HTTP应用到Cloud Foundry。 要点是,只要有一种方法可以创建可运行的fat(uber)jar,那么部署就非常简单– Cloud Foundry的Java buildpack可以利用所有信息并连接一切,以使其在Cloud中运行铸造环境。
在这里,我想讨论一个稍微复杂的场景-这是应用程序对MySQL数据库具有外部数据库依赖关系的地方。
在本地环境中,数据库的详细信息将使用通常指定的配置来解决,如下所示:
sampledb = {
url = "jdbc:mysql://localhost:3306/mydb?useSSL=false"
user = "myuser"
password = "mypass"
}
如果Mysql数据库位于Cloud Foundry环境之外,则指定数据库配置的这种方法将继续很好地工作。 但是,如果服务驻留在
Cloud Foundry市场 ,然后在与Application绑定时动态创建服务的详细信息。
为了使它更具体一点,在我本地的PCF Dev中 ,我有一个提供“ p-mysql”服务的市场。
如果我要以此创建“服务实例”:
并将此实例绑定到应用程序:
从本质上讲,此时发生的事情是该应用程序具有一个名为VCAP_SERVICES的环境变量,并且必须对其进行解析以获取db凭据。 当前方案中的VCAP_SERVICES看起来像这样:
{
"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 config可以很容易地解析它,示例代码(当然是hacky)看起来像这样:
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()
}
并通过以下方式调用:
val dbConfig = cfServicesHelper.getConfigFor("p-mysql", "mydb")
这将动态解析mysql的凭据,并允许应用程序连接到数据库。
一种更简单的方法可能是在我的github回购中查看示例代码-https://github.com/bijukunjummen/sample-akka-http-rest。
翻译自: https://www.javacodegeeks.com/2017/01/deploying-akka-http-app-cloud-foundry-2.html