2013-07-01 65 views
21

我在想如何將我已經在本地測試過的rest api部署到雲中,讓我們說像亞馬遜這樣的基礎設施即服務(而不是像Heroku這樣的服務平臺)。如何將噴霧API應用於生產?

我有我的本地envorinment設置與sbt和運行,但我的問題是我應該如何在生產環境中部署?

定義一個過程,在這個過程中,devops從git倉庫中取出最新的變更,然後執行sbt運行?

我想知道使用scala + spray + sbt的團隊如何將他們的apis部署到生產環境中。

回答

27

我們服務的核心是scala + akka + spray + mongo。所以我們使用GitHub進行版本控制。在將檢查過的PR合併到主分支後,Jenkins自動測試'建立項目。如果所有測試都成功,那麼Jenking運行幾個腳本:

  1. 增量項目版本(目前寫的外殼,但將改爲SBT)與sbt-assembly
  2. 運行
  3. 運行裝配任務部署腳本(用Python編寫的與面料)至極部署我們的罐子EC2

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作爲阿卡的微內核:

在這種情況下,你應該擴展可引導特質和覆蓋startupshutdown方法:

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

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

使用類型安全startscript:

無法顯示的例子,但對github一個很好的介紹=)

我們將使用所有的這種方式在不同的情況。

+0

您可否詳細說明在生產中如何處理噴灑服務的正常關閉?我可以創建一個問題。 – dmitry

+0

@dmitry我們沒有任何需要支持長連接,但是一般情況下,您可以使用帶有持久性+演員生命週期(演員掛鉤)的akka​​集羣。另一方面Spray也建立在Akka之上,所以你可以建立你自己的模塊,以正常的方式關閉一個服務器,通過'Unbind'消息給監聽者。 「解除綁定」需要一個正常關機時間,然後將其發送給監聽器並等待終止,然後您可以「關機」服務。 – 4lex1v

+1

只是上面的更新。看起來像TypeSafe是棄用開始腳本被替換爲sbt-native-packager https://github.com/sbt/sbt-native-packager –

2

你應該建立一個罐子插件sbt-assembly

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

然後你可以運行用java生產瓶子罐子

如果你給的版本號到您的項目,這是一個相當經典處理。

希望它有幫助。

-1

從來沒有去噴霧阿卡的PRO。只有寵物項目。我在這裏的建議應該被視爲靈感。我知道我提出的一些選項在維護方面代價高昂,或者容易出錯。

包裝

我只用行家遮陽簾插件(SBT有沒有經驗),但我想有一個類似的解決方案。

包裝問題

有這種方法雖然幾個問題。 Akka和許多噴霧模塊都使用references.conf和application.conf約定。當彙編/着色所有依賴關係時,資源(因爲它們被命名爲相同)可能會被覆蓋,並且您將無法啓動應用程序。

我發現的快速和骯髒的解決方案是將應用程序和ref.conf的依賴關係複製/粘貼到我控制的一個。