2011-07-12 39 views
28

Tôi định triển khai một API Web dựa trên REST thuần túy được hỗ trợ bởi Akka. Tôi không chắc chắn về việc sử dụng bình xịt. Tôi sẽ xem xét sử dụng Scalatra nếu nó là tốt. Về cơ bản tôi quan tâm đến việc sử dụng các lợi ích đồng thời của mô hình diễn viên Scala. Tôi không muốn container Servlet trở thành một trở ngại trong quá trình đó.Làm thế nào để thực hiện một dịch vụ Web REST bằng cách sử dụng Akka?

Các tùy chọn khác có thể là gì?

Cập nhật 1: Giao diện nào tốt hơn để triển khai REST dựa trên chương trình phụ trợ của Akka? - Phun, Scalatra hay Dropwizard hay bất kỳ thứ gì khác?

Trả lời

27

Điều quan trọng cần biết về Akka là nó không phải là môi trường hoàn toàn không có gì cả. Bạn có thể, đến một mức độ lớn, trộn và kết hợp các thư viện khác nhau để soạn hệ thống phù hợp với bạn. Ví dụ, tôi đã viết các ứng dụng sử dụng Dropwizard fronting một phụ trợ sử dụng Akka, không có vấn đề. Tôi cũng đã thực hiện tương tự với Clothesline (được triển khai trong Clojure, nhưng với Scala wrapper). Và cuối tuần này, tôi hy vọng sẽ thử nghiệm bằng cách sử dụng Unfiltered 's websocket implementation để ngồi trước Akka và một ống RabbitMQ để cho ăn gần dữ liệu thời gian thực cho các trình duyệt của khách hàng - Tôi đặc biệt đề cập đến ví dụ này bởi vì trình duyệt web chưa được lọc nằm trên trên cùng của Netty thay vì một thùng chứa servlet).

Cập nhật: Vì đã viết câu trả lời này một vài năm trước, tôi đã bắt đầu sử dụng Spray dành riêng cho phát triển RESTful với Akka. Mặc dù có thể sử dụng bất kỳ thư viện REST JVM nào, Spray rất phù hợp với mô hình dựa trên diễn viên của Akka và thư viện rõ ràng đã đạt đến mức độ trưởng thành, nơi nó có thể dễ dàng là lựa chọn mặc định. Sự tích hợp sắp tới của Spray vào Akka như mô-đun akka-http mới là một dấu hiệu rõ ràng về điều này.

+0

Tôi muốn để một người nào đó xây dựng một phiên bản của Netty + Unfiltered sử dụng Jetty Continuations và/hoặc Servlet 3.0 Async để tôi có thể móc Akka vào nó như thế. Tôi rất tò mò muốn nghe về toàn bộ trải nghiệm Akka của bạn, riêng tư nếu muốn. Hãy tiếp tục công việc tuyệt vời này, √ –

+1

Vâng, đã đến lúc cho phép, tôi rất thích quảng cáo chiêu hàng. Tôi biết đã có một số nền tảng ở đó, nhưng thật khó để có được một cảm giác của bao nhiêu công việc vẫn còn phải được thực hiện. Và đây là bước đột phá đầu tiên của tôi vào websockets (mặc dù, tôi đã làm rất nhiều với sao chổi, trong quá khứ), tôi do dự về những biến chứng có thể có liên quan. –

+0

Er, tôi muốn nói, tôi biết đã có một số nền tảng trong ý nghĩa rằng công việc đã được bắt đầu để làm điều đó trực tiếp trong Akka. Không chắc chắn nếu có ai đó đã cố triển khai tính năng này trong Unfiltered thông qua API Jetty/Servlet 3.0. Tôi nên đi nghiên cứu ... oh, những gì tôi sẽ cho một số thời gian rảnh. –

10

Nếu bạn muốn CODE thực hiện, thì tại đây. Nó đã cho tôi một chút để thực sự tìm ra những gì đang xảy ra, bởi vì có một TÔN ví dụ, và nó không rõ ràng những gì họ đang làm tất cả hoặc làm thế nào để đặt tất cả lại với nhau. Hóa ra đó là đơn giản hơn tôi nghĩ:

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 
} 

Và build.sbt của tôi trông giống như:

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

Hope this helps!

0

Tôi không biết tại sao bạn nghi ngờ sử dụng thùng chứa Servlet làm cơ sở - nó không thực sự giới hạn lựa chọn của bạn theo bất kỳ cách nào có thể, nó chỉ xử lý hệ thống ống nước máy chủ HTTP cơ bản. Như vậy, hầu hết các khung công tác dịch vụ java sử dụng API servlet làm nền tảng cơ bản ngay cả khi chúng không phơi bày mức đó.

Tôi nghĩ DropWizard là một lựa chọn tuyệt vời cho tất cả các loại dịch vụ phần còn lại của JVM, bao gồm cả những dịch vụ sử dụng Akka để nâng thực tế. Bên cạnh lý do rõ ràng về sự tốt lành của nó (dựa trên bộ sưu tập các thư viện được chứng minh là "tốt nhất của JVM"), tôi thích nó vì nó giúp ích trong các lĩnh vực mà nhiều libs/framework khác bỏ ra: sản xuất các số liệu, xác nhận khai báo; trong khi vẫn giữ mọi thứ đơn giản, rõ ràng và dễ hiểu.

5

Để hoàn chỉnh, có vẻ hữu ích khi có một ví dụ về Scalatra (kể từ khi được hỏi về Scalatra). Dưới đây là một số mã ví dụ từ 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") 
    } 

} 
+0

Tôi nhận được lỗi sau với mã ví dụ: scala: không thể tìm thấy giá trị tiềm ẩn cho thời gian chờ tham số: akka.util.Timeout new AsyncResult {val is = myActor? "Làm các công cụ và trả lời cho tôi"} – Owen

+0

Đổi tên val thời gian chờ để tOut làm việc cho tôi – Owen

3

sử dụng akka-http (người ta cũng gọi nó là phun 2,0) mà là dựa trên AKKA-stream riêng biệt.

Các vấn đề liên quan