29

我打算实现一个纯 Akka 支持的基于 REST 的 Web API。我不确定使用喷雾。如果有任何好处,我会考虑使用 Scalatra。基本上我对使用 Scala Actor 模型的并发优势很感兴趣。我不希望 Servlet 容器成为该过程的障碍。

还有什么其他选择?

更新 1:哪个是基于 Akka 后端实现 REST 的更好前端?- 喷雾、Scalatra 或 Dropwizard 或任何其他?

4

6 回答 6

27

关于 Akka,需要意识到的重要一点是,它不是一个全有或全无的环境。您可以在很大程度上混合和匹配不同的库来组成对您有意义的系统。例如,我编写了使用Dropwizard的应用程序,前端使用 Akka,没有问题。我也对Clothesline做了同样的事情(在 Clojure 中实现,但使用Scala 包装器)。本周晚些时候,我希望尝试使用Unfilteredwebsocket 实现坐在 Akka 前面,并使用 RabbitMQ 管道向客户端浏览器提供近乎实时的数据——我特别提到这个例子是因为 Unfiltered websocket impl 位于在Netty之上而不是 servlet 容器)。

更新:自从几年前写了这个答案以来,我已经开始专门使用Spray来使用 Akka 进行 RESTful 开发。虽然几乎可以使用任何 JVM REST 库,Spray 非常自然地适合 Akka 的基于 actor 的模型,并且该库显然已经达到了可以轻松成为默认选择的成熟度。即将作为新的 akka-http 模块将 Spray 集成到 Akka 中清楚地表明了这一点。

于 2011-07-12T18:45:44.673 回答
10

如果您希望代码执行此操作,那么就在这里。我花了一点时间才真正弄清楚发生了什么,因为有很多例子,而且不清楚他们都在做什么或如何将它们放在一起。事实证明它比我想象的要简单:

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

希望这可以帮助!

于 2012-02-28T16:52:38.930 回答
5

为了完整起见,有一个 Scalatra 示例似乎很有用(因为问题是关于 Scalatra 的)。以下是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")
  }

}
于 2013-04-04T13:04:36.763 回答
3

HTTP servlet 和许多容器是一种久经考验且值得信赖的技术。Akka 为您提供了它自己的嵌入式 servlet 容器的选择,或者您可以将它与您自己的.

当然,您可以使用 Netty 构建您自己的 Web 服务器,并且在 web 上有一篇关于此的有趣文章。

于 2011-07-12T18:24:55.817 回答
3

使用基于 akka-streams的 akka-http(人们也称之为spray-2.0)。

于 2015-03-13T03:24:40.563 回答
0

我不知道你为什么怀疑使用 Servlet 容器作为基础——它并没有以任何可能的方式真正限制你的选择,它只是处理基本的 HTTP 服务器管道。因此,大多数 java 服务框架使用 servlet API 作为基本基础,即使它们没有公开该级别。

我认为 DropWizard 是各种 JVM 休息服务的绝佳选择,包括使用 Akka 进行实际提升的服务。除了其优点的明显原因(基于被证明是“JVM 最好的”库的集合)之外,我喜欢它,因为它有助于许多其他库/框架遗漏的领域:指标的产生、声明性验证;始终保持简单、明确和易于理解。

于 2012-03-12T18:40:06.307 回答