Scala 如何使用Akka实现restweb服务?

Scala 如何使用Akka实现restweb服务?,scala,rest,akka,scalatra,Scala,Rest,Akka,Scalatra,我打算实现一个纯Akka支持的基于REST的Web API。我不确定是否要用喷雾剂。如果有任何好处,我会考虑使用SCALATRA。基本上,我对使用Scala Actor模型的并发性优势感兴趣。我不希望Servlet容器成为该过程的障碍 还有什么其他选择 更新1: 在Akka后端上实现REST,哪个前端更好Spray、Scalatra或Dropwizard或任何其他?HTTP servlet和许多容器都是一种久经考验且值得信赖的技术。Akka为您提供选择,或者您可以使用它 当然,您可以使用Nett

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

还有什么其他选择

更新1:
在Akka后端上实现REST,哪个前端更好Spray、Scalatra或Dropwizard或任何其他?

HTTP servlet和许多容器都是一种久经考验且值得信赖的技术。Akka为您提供选择,或者您可以使用它


当然,您可以使用Netty启动自己的web服务器,这是一个有趣的问题。

关于Akka,需要了解的重要一点是,它不是一个全有或全无的环境。您可以在很大程度上混合和匹配不同的库,以组成对您有意义的系统。例如,我编写了一些应用程序,它们使用前台,后台使用Akka,没有问题。我也使用(在Clojure中实现,但使用了)。本周晚些时候,我希望尝试使用位于Akka前面的和RabbitMQ管道向客户端浏览器提供近实时数据——我特别提到这个示例,因为未过滤的websocket impl位于(而不是servlet容器)的顶部


更新:自从几年前写下这个答案后,我开始专门使用Akka进行RESTful开发。虽然几乎可以使用任何jvmrest库,但是Spray非常自然地适合Akka基于actor的模型,而且该库显然已经达到了成熟的程度,可以轻松地作为默认选择。即将将Spray作为新的Akka http模块集成到Akka中,这是一个明确的指示。

如果您想让代码实现这一点,那么它就在这里。我花了一点时间才真正弄清楚到底发生了什么,因为有很多例子,不清楚它们都在做什么,或者如何把它们放在一起。结果比我想象的要简单:

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

希望这有帮助

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


我认为DropWizard对于所有类型的JVM rest服务都是一个不错的选择,包括那些使用Akka进行实际提升的服务。除了其优点的明显原因(基于被证明是“JVM最好的”库集合),我喜欢它,因为它在许多其他LIB/框架遗漏的领域有帮助:指标的生成、声明性验证;始终保持事情的简单、明确和可理解。

为了完整起见,使用Scalatra示例似乎很有用(因为问题是关于Scalatra的)。下面是来自的一些示例代码:


使用(人们也叫它spray-2.0),它基于akka streams。

我希望有人能构建一个使用Jetty Continuations和/或Servlet 3.0 Async的Netty+Unfiltered版本,这样我就可以把akka像那样挂到它上面。我很想知道你在阿克卡的经历,如果愿意的话,可以私下谈谈。继续努力,√是的,如果时间允许的话,我很乐意参与进来,把它加上去。我知道已经有了一些基础,但很难知道还有多少工作要做。这是我第一次涉足websockets(虽然,我在过去对comet做了很多),但我对可能涉及的复杂问题犹豫不决。呃,我的意思是,我知道已经有了一些基础工作,因为这项工作是在Akka直接开始的。不确定是否有人试图通过Jetty/Servlet 3.0 API在未经过滤的环境中实现此功能。我应该去研究一下。。。哦,我愿意为一些空闲时间付出什么。我在未过滤代码库方面的经验太少了,但我一直是大气项目和雾中固定问题的一部分,所以我有相当多的彗星经验。不幸的是,乔纳斯现在正在度假,所以我很忙,但我很想看到有人来接。Unfiltered具有优异的性能,因此将其与异步性配对将是一个杀手。@Thomas dropwizard与spray或scalatra相比如何?我在示例代码中遇到以下错误:scala:找不到参数超时的隐式值:akka.util.timeout new AsyncResult{val is=myActor?“做一些事情并给我一个答案”}
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")
  }

}