具有多个路由配置的 akka-http
akka-http with multiple route configurations
快速背景
我正在 运行 通过一些示例学习 Akka HTTP 堆栈以创建一个新的 REST 项目(完全非 UI)。我一直在使用和扩充 Akka HTTP Microservice Example 来处理大量用例和配置,并对 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")
这样的注释在我的 类 中做事的方式想得太多了。如果是这样,请随时指出心态的变化。
问题 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"))
}
这里有一些文档:
- http://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/overview.html
- http://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/routes.html
问题 2 - 单独路由、编组等
是的,您可以将路由、编组和应用程序逻辑分开。这里有激活器示例:https://github.com/theiterators/reactive-microservices
问题 3 - 使用注释处理路由
我不知道有任何允许您使用注解在 akka-http 中定义路由的库。尝试了解有关 DSL 路由的更多信息。这代表了一种不同的 http 路由方法,但它也是一种方便的工具。
快速背景
我正在 运行 通过一些示例学习 Akka HTTP 堆栈以创建一个新的 REST 项目(完全非 UI)。我一直在使用和扩充 Akka HTTP Microservice Example 来处理大量用例和配置,并对 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")
这样的注释在我的 类 中做事的方式想得太多了。如果是这样,请随时指出心态的变化。
问题 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"))
}
这里有一些文档:
- http://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/overview.html
- http://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/routes.html
问题 2 - 单独路由、编组等
是的,您可以将路由、编组和应用程序逻辑分开。这里有激活器示例:https://github.com/theiterators/reactive-microservices
问题 3 - 使用注释处理路由
我不知道有任何允许您使用注解在 akka-http 中定义路由的库。尝试了解有关 DSL 路由的更多信息。这代表了一种不同的 http 路由方法,但它也是一种方便的工具。