scala - invocar - ¿Cómo implementar un servicio web REST usando Akka?
servicios rest ejemplo (6)
Lo importante a tener en cuenta acerca de Akka es que no es un entorno de todo o nada. Puede, en gran medida, mezclar y combinar diferentes bibliotecas para componer el sistema que tenga sentido para usted. Por ejemplo, he escrito aplicaciones que usan Dropwizard frente de un backend que usa Akka, sin problemas. También he hecho lo mismo con Clothesline (implementado en Clojure, pero con un envoltorio Scala ). Y más adelante esta semana, espero experimentar con el uso de la implementación de websocket de Unfiltered para ubicarme frente a Akka y una tubería RabbitMQ para enviar datos en tiempo real a los navegadores del cliente. encima de Netty lugar de un contenedor de servlets).
Actualización : desde que escribí esta respuesta hace unos años, comencé a usar Spray exclusivamente para el desarrollo de RESTful con Akka. Si bien se puede usar casi cualquier biblioteca REST de JVM, Spray se adapta muy naturalmente al modelo basado en actores de Akka y la biblioteca ha alcanzado claramente un nivel de madurez en el que puede ser la opción predeterminada. La próxima integración de Spray en Akka como el nuevo módulo akka-http es una clara indicación de esto.
Tengo la intención de implementar una API web basada en REST basada únicamente en Akka. No estoy seguro de usar spray. Yo consideraría usar Scalatra si es bueno. Básicamente, estoy interesado en utilizar los beneficios de concurrencia del modelo Scala Actor. No quiero que el contenedor Servlet sea un obstáculo en ese proceso.
¿Qué pueden ser otras opciones?
Actualización 1: ¿Cuál es el mejor frontend para implementar REST basado en el backend de Akka? - ¿Spray, Scalatra o Dropwizard o cualquier otro?
Los servlets HTTP y los muchos contenedores existentes son una tecnología probada y confiable. Akka le ofrece la opción de su propio contenedor de servlet incorporado , o puede usarlo con el suyo .
Puede, por supuesto, rodar su propio servidor web con Netty, y hay una interesante reseña sobre esto en la web .
No sé por qué sospechas de usar un contenedor Servlet como base, realmente no limita tu elección de ninguna manera posible, solo maneja las tuberías básicas del servidor HTTP. Como tal, la mayoría de los marcos de servicios java utilizan la API de servlet como base básica, incluso si no exponen ese nivel.
Creo que DropWizard es una excelente opción para todos los tipos de servicios de descanso de JVM, incluidos los que utilizan Akka para el levantamiento real. Además de la razón obvia de su bondad (basada en la colección de bibliotecas probada como "la mejor de JVM"), me gusta porque ayuda en áreas que muchas otras librerías / marcos dejan de lado: producción de métricas, validación declarativa; Todo el tiempo manteniendo las cosas simples, explícitas y comprensibles.
Para completar, parece útil tener un ejemplo de Scalatra (ya que la pregunta sobre Scalatra). Aquí hay un código de ejemplo de la Guía Scalatra Akka :
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")
}
}
Si quieres que el CÓDIGO lo haga, aquí está. Me tomó un poco entender realmente lo que está pasando, porque hay un montón de ejemplos, y no está claro qué están haciendo todos o cómo ponerlo todo junto. Resulta que era más simple de lo que pensaba:
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
}
Y mi build.sbt se parece a
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"
)
¡Espero que esto ayude!
usando akka-http (la gente también lo llama spray-2.0 ) que se basa en akka-streams.