将akka-http应用程序部署到Cloud Foundry

在前面的文章中,我已经走了过来的步骤来部署一个简单的阿卡-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”服务的市场。

将akka-http应用程序部署到Cloud Foundry_第1张图片

如果我要以此创建“服务实例”:

并将此实例绑定到应用程序:

从本质上讲,此时发生的事情是该应用程序具有一个名为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

你可能感兴趣的:(java,linux,docker,数据库,tomcat)