23

我正在考虑如何将我已经在本地测试过的rest api部署到云中,比如说像亚马逊这样的基础设施即服务(而不是像Heroku这样的平台即服务)。

我已经用 sbt 设置了本地环境并运行,但我的问题是我应该如何在生产环境中部署它?

定义一个流程是否合理,在该流程中 devops 从 git repo 中提取最新更改,然后简单地执行 sbt run?

我想知道使用 scala+spray+sbt 的团队如何将他们的 api 部署到生产环境中。

4

3 回答 3

27

我们服务的核心是 scala + akka + spray + mongo。所以我们使用 GitHub 进行版本控制。将已检查的 PR 合并到 master 分支后,Jenkins 会自动测试“n”构建项目。如果所有测试都成功,那么 Jenking 会运行几个脚本:

  1. 增量项目版本(目前用shell写,但会改成sbt)
  2. 使用sbt-assembly运行组装任务
  3. 运行部署脚本(用 Python 和 Fabric 编写),将我们的 jar 部署到 EC2

基本上在第三步你有几个选择:

使用 IO/Spray 启动文件制作一个可运行的 jar:

object Boot extends App {
  implicit val system = ActorSystem("ServiceName")
  val log = system.log
  val service = system.actorOf(Props[Service], name="serviceActor")
  IO(Http) ! Http.Bind(service, interface = host, port = port)
}

制作一个可运行的 jar 作为 Akka 的微内核:

在这种情况下,您应该扩展 Bootable 特征并覆盖startupshutdown方法:

class Kernel extends Bootable {
  // many lines of code
  def startup() {
    scheduler.start()
    SomeActorSystem.startup()
  }

  def shutdown() {
    scheduler.shutdown()
    SomeActorSystem.shutdown()
    system.shutdown()
  }
}

使用 TypeSafe 启动脚本:

无法显示示例,但它在github上有很好的介绍=)

我们在不同的情况下使用所有这些方式。

于 2013-07-01T07:44:09.480 回答
2

You should build a jar with the plugin sbt-assembly

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0")

Then you can run the jar in production with java -jar

If you give version number to your project, this is a rather classic process.

Hope it helps.

于 2013-07-01T07:29:37.957 回答
-1

从来没有用 spray-akka 去 PRO。只有宠物项目。我在这里的建议应该被视为灵感。我知道我提出的一些选项在维护方面成本高昂或容易出错。

打包

我只使用了 maven-shade-plugin (没有使用 sbt 的经验),但我想有一个类似的解决方案。

包装问题

不过,这种方法几乎没有问题。Akka 和许多喷雾模块使用references.conf 和application.conf 约定。在组装/着色所有依赖项时,资源(因为它们的名称相同)可能会覆盖并且您将无法启动应用程序。

我发现的快速而肮脏的解决方案是将应用程序和依赖项的 ref.conf 复制/粘贴到我控制的一个中。

于 2013-07-01T07:45:03.707 回答