【问题标题】:How to deploy my spray API into production?如何将我的喷雾 API 部署到生产环境中?
【发布时间】:2013-06-28 02:54:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: scala akka spray


    【解决方案1】:

    你应该用插件sbt-assembly构建一个jar

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

    然后你可以使用 java -jar 在生产环境中运行 jar

    如果你给你的项目提供版本号,这是一个相当经典的过程。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      我们服务的核心是 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 上有很好的介绍 =)

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

      【讨论】:

      • 您能否详细说明一下您在生产中如何处理喷雾服务的正常关闭?我可以创建一个问题。
      • @dmitry 我们不需要支持长连接,但一般来说,您可以使用具有持久性 + 演员生命周期(演员挂钩)的 akka 集群。另一方面,Spray 也是在 Akka 之上构建的,因此您可以构建自己的模块来优雅地关闭服务器,并向侦听器 actor 发送 Unbind 消息。 Unbind 需要一个优雅的关闭时间,然后将其发送给监听器并等待 Terminated,然后您可以 shutdown 为您服务。
      • 只是对上述内容的更新。看起来 TypeSafe 正在弃用 startscript 以替换为 sbt-native-packager github.com/sbt/sbt-native-packager
      【解决方案3】:

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

      包装

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

      包装问题

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

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

      【讨论】:

        猜你喜欢
        • 2016-10-05
        • 1970-01-01
        • 2017-02-01
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 2020-05-16
        • 1970-01-01
        • 2013-10-15
        相关资源
        最近更新 更多