2013-07-01 8 views
21

Sto pensando a come dovrebbe essere il processo per implementare la mia API di riposo già testata localmente sul cloud, diciamo un'infrastruttura come servizio (non una piattaforma come un servizio come Heroku) come Amazon.Come distribuire la mia API spray nella produzione?

Ho il mio ambiente locale impostato con sbt installato e funzionante, ma la mia domanda è Come dovrei distribuire questo in un ambiente di produzione?

È ragionevole definire un processo in cui il devops estrae le modifiche più recenti dal repository git e quindi esegue semplicemente sbt run?

Desidero sapere in che modo i team che utilizzano scala + spray + sbt distribuiscono le proprie API in un ambiente di produzione.

risposta

27

Il cuore dei nostri servizi è scala + akka + spray + mongo. Quindi stiamo usando GitHub per il controllo della versione. Dopo aver unito i PR controllati al ramo principale, Jenkins esegue automaticamente il test dei progetti delle build. Se tutti i test hanno avuto successo, allora Jenking gestisce un paio di script:

  1. versione del progetto di incremento (attualmente scritto in guscio, ma verrà modificato in SBT)
  2. Run compito montaggio con sbt-assembly
  3. Run distribuire lo script (scritto in Python con tessuto) Quale distribuisce il nostro vaso di EC2

Basicaly sul gradino thrid si dispone di un paio di scelte:

Fai un barattolo eseguibile utilizzando il file IO/boot Spray:

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) 
} 

Fai un barattolo eseguibile come microkernel di Akka:

In questo caso si dovrebbe estendere la caratteristica di avvio e ignorare startup e shutdown metodi:

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

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

Utilizzando uno StartScript typesafe:

non può mostrare un esempio, ma ha una buona introduzione sul github =)

Stiamo utilizzando tutti in questo modo in diversi casi.

+0

Potresti approfondire il modo in cui gestisci l'arresto regolare per i servizi di spruzzatura in produzione? Posso creare una domanda. – dmitry

+0

@dmitry Non abbiamo alcuna necessità di supportare connessioni long-live, ma in generale è possibile utilizzare il cluster akka con il ciclo di vita di persistenza + attori (hook degli attori). D'altra parte, Spray è anche costruito su Akka, quindi puoi costruire il tuo modulo per spegnere con grazia un server con il messaggio 'Unbind' sull'attore ascoltatore. 'Unbind' richiede un tempo di spegnimento regolare, quindi lo invia all'ascoltatore e aspetta Terminato, quindi puoi 'spegnere' il tuo servizio. – 4lex1v

+1

Solo un aggiornamento a quanto sopra. Sembra che TypeSafe stia sostituendo lo script iniziale con sbt-native-packager https://github.com/sbt/sbt-native-packager –

2

Si dovrebbe costruire un vaso con il plugin sbt-assembly

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

Quindi è possibile eseguire il vaso in produzione con java-jar

Se si dà il numero di versione per il vostro progetto, questo è un piuttosto classico processi.

Spero che aiuti.

-1

Mai andato a PRO con spray-akka. Solo progetti per animali domestici. I miei suggerimenti qui dovrebbero essere presi come ispirazione. So che alcune delle opzioni che presento sono costose in termini di manutenzione o soggette a errori.

Imballaggio

Ho solo usato Maven-ombra-plugin (nessuna esperienza con SBT), ma immagino che ci sia una soluzione simile.

Packaging Problemi

C'è qualche problema con questo approccio però. Akka e molti dei moduli spray usano la convenzione references.conf e application.conf. Quando assemblate/ombreggiate tutte le vostre dipendenze, le risorse (dato che sono identificate come stesse) potrebbero sovrascrivere e non sarete in grado di avviare l'applicazione.

La soluzione rapida e sporca che ho trovato era copiare/incollare l'applicazione e ref.conf delle dipendenze in una controllata da me.

Problemi correlati