web-dev-qa-db-fra.com

Comment implémenter un REST Service Web utilisant Akka?

J'ai l'intention d'implémenter une API Web basée sur REST et basée sur Akka. Je ne suis pas sûr d'utiliser un spray. J'envisagerais d'utiliser Scalatra si c'est bon. Fondamentalement, je suis intéressé par l’utilisation des avantages de concurrence du modèle Scala Actor. Je ne veux pas que le conteneur Servlet soit un obstacle dans ce processus.

Quelles peuvent être les autres options?

Mise à jour 1: Quel est le meilleur frontal pour implémenter REST basé sur le backend Akka? - Spray, Scalatra ou Dropwizard ou autre?

28

La chose importante à réaliser à propos d’Akka est que ce n’est pas un environnement «tout ou rien». Vous pouvez, dans une large mesure, mélanger et assortir différentes bibliothèques pour composer le système qui vous convient. Par exemple, j'ai écrit des applications qui utilisent Dropwizard faisant face à un serveur utilisant Akka, sans aucun problème. J'ai aussi fait la même chose avec Clothesline (implémenté dans Clojure, mais avec un Scala wrapper ). Et plus tard cette semaine, j'espère expérimenter l'utilisation de Non filtré ' - implémentation websocket pour vous asseoir devant Akka et un tuyau RabbitMQ permettant de fournir des données en temps quasi réel aux navigateurs clients - je mentionne spécifiquement Cet exemple, car la commande Web non filtrée implique au-dessus de Netty plutôt que d'un conteneur de servlet).

Mise à jour : Depuis que cette réponse a été écrite il y a quelques années, j'ai commencé à utiliser Spray exclusivement pour le développement RESTful avec Akka. Bien que pratiquement toutes les bibliothèques JVM REST puissent être utilisées, Spray s’intègre très naturellement dans le modèle basé sur les acteurs d’Akka et la bibliothèque a clairement atteint un niveau de maturité où elle peut facilement être le choix par défaut. L'intégration prochaine de Spray dans Akka en tant que nouveau module akka-http en est une indication claire.

27
Thomas Lockney

Si vous voulez que le CODE le fasse, alors le voici. Il m'a fallu un peu de temps pour vraiment comprendre ce qui se passait, car il y a une tonne d'exemples, et on ne sait pas exactement ce qu'ils font ou comment les assembler. Il s'est avéré que c'était plus simple que je ne le pensais:

package com.nthalk.akkatest

import akka.actor.Actor.actorOf
import akka.actor.Actor
import akka.camel.Consumer
import akka.camel.Message
import akka.camel.CamelServiceManager

class MyActor extends Actor with Consumer {
  def endpointUri = "jetty:http://localhost:8877/"
  def receive = {
    case msg: Message => { self.reply("State Rest Service: Achieved") }
    case _ => { self.reply("Really, no message?") }
  }
}

object App extends scala.App {
  actorOf[MyActor].start
  CamelServiceManager.startCamelService
}

Et mon build.sbt ressemble à:

organization := "com.nthalk"

name := "akkatest"

version := "0.1.0"

resolvers += 
  "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++= Seq(
  "org.Apache.camel" % "camel-jetty" % "2.9.0",
  "se.scalablesolutions.akka" % "akka-camel" % "1.3.1"
  )

J'espère que cela t'aides!

10
Nthalk

Pour être complet, il semble utile d’avoir un exemple de Scalatra (puisque la question posée à propos de Scalatra). Voici un exemple de code tiré du Scalatra Akka Guide :

package com.example.app

import akka.actor.{ActorRef, Actor, Props, ActorSystem}
import akka.dispatch.ExecutionContext
import akka.util.Timeout
import org.scalatra.FutureSupport
import org.scalatra.{Accepted, ScalatraServlet}

class MyActorApp(system:ActorSystem, myActor:ActorRef) extends ScalatraServlet with     FutureSupport {

  protected implicit def executor: ExecutionContext = system.dispatcher

  import _root_.akka.pattern.ask
  implicit val timeout = Timeout(10)

  get("/async") {
    new AsyncResult { def is = myActor ? "Do stuff and give me an answer" }
  }

  get("/fire-forget") {
    myActor ! "Hey, you know what?"
    Accepted()
  }
}

class MyActor extends Actor {
  def receive = {
    case "Do stuff and give me an answer" => sender ! "The answer is 42"
    case "Hey, you know what?" => println("Yeah I know... oh boy do I know")
  }

}
5
futurechimp

Les servlets HTTP et les nombreux conteneurs existants constituent une technologie éprouvée et fiable. Akka vous offre le choix/ son propre conteneur de servlets intégré , ou vous pouvez l'utiliser avec votre propre .

Vous pouvez, bien sûr, lancer votre propre serveur Web avec Netty, et il y a une une description intéressante à ce sujet sur le Web .

3
opyate

en utilisant akka-http (les gens l'appellent aussi spray-2.0 ) qui est basé sur les flux akka.

3
Windor C

Je ne sais pas pourquoi vous vous méfiez d'utiliser un conteneur Servlet comme base - cela ne limite pas vraiment votre choix, il gère uniquement la plomberie de serveur HTTP de base. En tant que tel, la plupart des services Java Les frameworks utilisent l'API servlet comme base de base même s'ils n'exposent pas ce niveau.

Je pense que DropWizard est un excellent choix pour tous les types de services de repos JVM, y compris ceux qui utilisent Akka pour le levage réel. Outre la raison évidente de sa qualité (basée sur une collection de bibliothèques qui s'est avérée être "la meilleure des machines virtuelles"), j'aime bien parce que cela aide dans des domaines que beaucoup d'autres librairies/frameworks laissent de côté: production de métriques, validation déclarative; tout en gardant les choses simples, explicites et compréhensibles.

0
StaxMan