我正在考虑如何将我已经在本地测试过的rest api部署到云端的流程,让我们说基础架构即服务(不是像Heroku这样的服务平台),如亚马逊。
我的本地环境设置已经启动并运行但我的问题是我应该如何在生产环境中部署它?
定义一个进程,在这个进程中,devops从git repo中获取最新的更改然后只执行sbt run?
我想知道使用scala + spray + sbt的团队如何将他们的api部署到生产环境。
答案 0 :(得分:27)
我们服务的核心是scala + akka + spray + mongo。所以我们使用GitHub进行版本控制。在将已检查的PR合并到主分支之后,Jenkins自动测试'n'构建项目。如果所有测试都成功,那么Jenking会运行几个脚本:
基本上在第三步中您有几个选择:
使用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的微内核:
在这种情况下,您应该扩展可启动特征并覆盖startup
和shutdown
方法:
class Kernel extends Bootable {
// many lines of code
def startup() {
scheduler.start()
SomeActorSystem.startup()
}
def shutdown() {
scheduler.shutdown()
SomeActorSystem.shutdown()
system.shutdown()
}
}
使用TypeSafe启动码:
无法展示示例,但它在github =)
上有一个很好的介绍我们在不同的情况下使用所有这些方式。
答案 1 :(得分:2)
您应该使用插件sbt-assembly
构建一个jaraddSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0")
然后你可以使用java -jar
在生产中运行jar如果您为项目提供版本号,这是一个相当经典的过程。
希望它有所帮助。
答案 2 :(得分:-1)
从未使用spray-akka前往PRO。只有宠物项目。我的建议应该作为灵感。我知道我提出的一些选项在维护方面成本很高或容易出错。
<强>包装强>
我只使用了maven-shade-plugin(没有使用sbt的经验),但我想有类似的解决方案。
打包问题
但这种方法存在一些问题。 Akka和许多喷雾模块使用references.conf和application.conf约定。当汇编/着色所有依赖项时,资源(因为它们的名称相同)可能会覆盖,您将无法启动应用程序。
我找到的快速而肮脏的解决方案是将依赖项的应用程序和ref.conf复制/粘贴到我控制的一个。