13

快速背景

我正在通过一些示例学习 Akka HTTP 堆栈以创建新的 REST 项目(完全非 UI)。我一直在使用和扩充Akka HTTP 微服务示例来处理大量用例和配置,并且对 Scala 和 Akka HTTP 的工作效果感到惊喜。

当前设置

目前我有这样的配置:

object AkkaHttpMicroservice extends App with Service {
  override implicit val system = ActorSystem()
  override implicit val executor = system.dispatcher
  override implicit val materializer = ActorMaterializer()

  override val config = ConfigFactory.load()
  override val logger = Logging(system, getClass)

  Http().bindAndHandle(routes, config.getString("http.interface"), config.getInt("http.port"))
}

routes参数只是一个简单的值,其中包含使用 、 等的典型path数据pathPrefix

问题

有什么方法可以在多个 Scala 文件或某个地方的示例中设置路由?

我真的希望能够定义一组类来分离关注点并处理 Actor 设置和处理以处理应用程序的不同区域,并将编组留给根App扩展。

这可能是我想太多了,因为我是如何在 Java 中使用@javax.ws.rs.Path("/whatever")我的类上的注释来做事的。如果是这种情况,请随时指出思维方式的变化。

我尝试搜索几组不同的关键字,但我认为我问错了问题(例如12)。

4

1 回答 1

28

问题 1 - 在多个文件中组合路由

您可以很容易地组合来自多个文件的路线。

FooRouter.scala

object FooRouter {
   val route = path("foo") {
       complete {
          Ok -> "foo"
       } 
   }       
}

BarRouter.scala

object BarRouter {
   val route = path("bar") {
       complete {
          Ok -> "bar"
       } 
   }       
}

MainRouter.scala

import FooRouter
import BarRouter
import akka.http.scaladsl.server.Directives._
import ...

object MainRouter {
   val routes = FooRouter.route ~ BarRouter.route
}

object AkkaHttpMicroservice extends App with Service {
  ...    
  Http().bindAndHandle(MainRouter.routes, config.getString("http.interface"), config.getInt("http.port"))
}

在这里,您有一些文档:

问题 2 - 单独路由、编组等

是的,您可以分离路由、编组和应用程序逻辑。这里有激活器示例:https ://github.com/theiterators/reactive-microservices

问题 3 - 使用注解处理路由

我不知道任何允许您使用注释在 akka-http 中定义路由的库。尝试了解有关 DSL 路由的更多信息。这代表了一种不同的 http 路由方法,但它也是一种方便的工具。

于 2015-12-29T17:44:07.193 回答