Подтвердить что ты не робот

Как реализовать веб-службу REST с помощью Akka?

Я намерен реализовать чистый веб-API, основанный на REST на основе Akka. Я не уверен в использовании спрея. Я бы подумал о том, чтобы использовать Scalaтру, если это хорошо. В основном я заинтересован в использовании преимуществ concurrency Scala модели Actor. Я не хочу, чтобы контейнер Servlet был помехой в этом процессе.

Какие могут быть другие варианты?

Обновление 1: Что лучше использовать для реализации REST на базе Akka? - Спрей, Scalaтра или Dropwizard или любой другой?

4b9b3361

Ответ 1

Важная вещь, чтобы осознать Акку, заключается в том, что она не является средой "все или ничего". Вы можете в значительной степени смешивать и сопоставлять разные библиотеки, чтобы составить систему, которая имеет смысл для вас. Например, я написал приложения, которые используют Dropwizard, выходящие за бэкэнд, который использует Akka, без проблем. Я также сделал то же самое с Clothesline (реализован в Clojure, но с Scala оберткой). И позже на этой неделе я надеюсь поэкспериментировать с использованием Unfiltered внедрения websocket, чтобы сидеть перед Akka и канал RabbitMQ для подачи данных в реальном времени в клиентские браузеры. Я упоминаю этот пример, потому что Unfiltered websocket impl находится поверх Netty, а не контейнер сервлетов).

Обновление. Поскольку я написал этот ответ несколько лет назад, я начал использовать Spray исключительно для разработки RESTful с помощью Akka, Хотя в значительной степени можно использовать любую библиотеку JVM REST, Spray очень естественно вписывается в акторскую модель Akka, и библиотека явно достигла уровня зрелости, где ее можно легко выбрать по умолчанию. Предстоящая интеграция Spray в Akka как нового модуля akka-http является явным свидетельством этого.

Ответ 2

Если вы хотите, чтобы CODE сделал это, то вот оно. Мне понадобилось немного времени, чтобы понять, что происходит, потому что есть примеры TON, и неясно, что они все делают или как все это объединяет. Оказывается, это было проще, чем я думал:

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
}

И мой файл build.sbt выглядит так:

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

Надеюсь, это поможет!

Ответ 3

Для полноты, кажется, полезно иметь пример Scalaтры (так как вопрос спросил о Scalaтре). Вот пример кода из Руководство 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")
  }

}

Ответ 4

HTTP-сервлеты и множество контейнеров - это проверенная и надежная технология. Akka предлагает вам выбор собственного встроенного контейнера сервлетов, или вы можете использовать его с вашим собственным.

Вы можете, конечно, свернуть свой собственный веб-сервер с Netty, и там интересная запись об этом в Интернете.

Ответ 5

используя akka-http (люди также называют его распылителем-2.0), который основан на акка-потоках.

Ответ 6

Я не знаю, почему вы подозрительно относитесь к использованию контейнера Servlet в качестве базы - он на самом деле не ограничивает ваш выбор каким-либо возможным способом, он просто обрабатывает базовую установку HTTP-сервера. Таким образом, большинство инфраструктур java-сервисов используют API-интерфейс сервлетов в качестве базовой основы, даже если они не раскрывают этот уровень.

Я думаю, что DropWizard - отличный выбор для всех видов услуг для отдыха JVM, включая те, которые используют Akka для фактического подъема. Помимо очевидной причины его доброты (основанной на сборе библиотек, которые, как оказалось, были "JVM best" ), мне это нравится, потому что это помогает в тех областях, которые не учитываются во многих других libs/framework: производство метрик, декларативная валидация; все время сохраняя вещи простыми, ясными и понятными.