我在想如何將我已經在本地測試過的rest api部署到雲中,讓我們說像亞馬遜這樣的基礎設施即服務(而不是像Heroku這樣的服務平臺)。如何將噴霧API應用於生產?
我有我的本地envorinment設置與sbt和運行,但我的問題是我應該如何在生產環境中部署?
定義一個過程,在這個過程中,devops從git倉庫中取出最新的變更,然後執行sbt運行?
我想知道使用scala + spray + sbt的團隊如何將他們的apis部署到生產環境中。
我在想如何將我已經在本地測試過的rest api部署到雲中,讓我們說像亞馬遜這樣的基礎設施即服務(而不是像Heroku這樣的服務平臺)。如何將噴霧API應用於生產?
我有我的本地envorinment設置與sbt和運行,但我的問題是我應該如何在生產環境中部署?
定義一個過程,在這個過程中,devops從git倉庫中取出最新的變更,然後執行sbt運行?
我想知道使用scala + spray + sbt的團隊如何將他們的apis部署到生產環境中。
我們服務的核心是scala + akka + spray + mongo。所以我們使用GitHub進行版本控制。在將檢查過的PR合併到主分支後,Jenkins自動測試'建立項目。如果所有測試都成功,那麼Jenking運行幾個腳本:
Basicaly你有幾個選擇的THRID步:
使用IO /噴霧引導文件做一個可運行的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作爲阿卡的微內核:
在這種情況下,你應該擴展可引導特質和覆蓋startup
和shutdown
方法:
class Kernel extends Bootable {
// many lines of code
def startup() {
scheduler.start()
SomeActorSystem.startup()
}
def shutdown() {
scheduler.shutdown()
SomeActorSystem.shutdown()
system.shutdown()
}
}
使用類型安全startscript:
無法顯示的例子,但對github一個很好的介紹=)
我們將使用所有的這種方式在不同的情況。
你應該建立一個罐子插件sbt-assembly
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0")
然後你可以運行用java生產瓶子罐子
如果你給的版本號到您的項目,這是一個相當經典處理。
希望它有幫助。
從來沒有去噴霧阿卡的PRO。只有寵物項目。我在這裏的建議應該被視爲靈感。我知道我提出的一些選項在維護方面代價高昂,或者容易出錯。
包裝
我只用行家遮陽簾插件(SBT有沒有經驗),但我想有一個類似的解決方案。
包裝問題
有這種方法雖然幾個問題。 Akka和許多噴霧模塊都使用references.conf和application.conf約定。當彙編/着色所有依賴關係時,資源(因爲它們被命名爲相同)可能會被覆蓋,並且您將無法啓動應用程序。
我發現的快速和骯髒的解決方案是將應用程序和ref.conf的依賴關係複製/粘貼到我控制的一個。
您可否詳細說明在生產中如何處理噴灑服務的正常關閉?我可以創建一個問題。 – dmitry
@dmitry我們沒有任何需要支持長連接,但是一般情況下,您可以使用帶有持久性+演員生命週期(演員掛鉤)的akka集羣。另一方面Spray也建立在Akka之上,所以你可以建立你自己的模塊,以正常的方式關閉一個服務器,通過'Unbind'消息給監聽者。 「解除綁定」需要一個正常關機時間,然後將其發送給監聽器並等待終止,然後您可以「關機」服務。 – 4lex1v
只是上面的更新。看起來像TypeSafe是棄用開始腳本被替換爲sbt-native-packager https://github.com/sbt/sbt-native-packager –