Как реализовать веб-сервис REST с использованием Akka? - PullRequest
28 голосов
/ 12 июля 2011

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

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

Обновление 1: Какой лучший интерфейс для реализации REST на основе бэкэнда Akka? - Спрей, Скалатра или Волшебник или любой другой?

Ответы [ 6 ]

27 голосов
/ 12 июля 2011

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

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

10 голосов
/ 28 февраля 2012

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

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

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

5 голосов
/ 04 апреля 2013

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

}
3 голосов
/ 13 марта 2015

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

3 голосов
/ 12 июля 2011

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

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

0 голосов
/ 12 марта 2012

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

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

...