【问题标题】:akka-http with multiple route configurations具有多个路由配置的 akka-http
【发布时间】:2016-04-03 12:48:25
【问题描述】:

快速背景

我正在通过一些示例学习 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 参数只是一个简单的值,其中包含使用 pathpathPrefix 等的典型数据。

问题

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

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

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

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

【问题讨论】:

    标签: scala akka-http


    【解决方案1】:

    问题 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 路由方法,但它也是一种方便的工具。

    【讨论】:

    • 谢谢。查找 DSL 路由让我走上了一条好路,并稍微改变了我的方法。这似乎是解决我手头特定问题的更合适的心态。问题 1 的问题是我试图避免编辑多个文件(即,单独的文件,然后在应用程序中添加路由连接)。
    • 这让我发疯了。我使用了doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/…,效果很好。以前使用过FooRouter.route ~ BarRouter.route,但它抛出了一些解组异常。谢谢你救了我的头发。
    • 值得一提的是,您需要写 import akka.http.scaladsl.server.Directives._ 才能使其工作。文档:doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/…
    • 使用这种方法对我来说会导致错误:Http().bindAndHandle(MainRouter.routes 对我来说是抛出错误,它是说Type mismatch, expected: Flow[HttpRequest, HttpResponse, Any], actual: server.Route
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多