Vertx Web:如何跨多个文件拆分和组织路由?

Vertx Web: How to split and organize routes across multiple files?

到目前为止,我真的很喜欢 Vertx。文档很棒,跨语言支持也很棒。

但是,针对我的特定问题的示例和文档似乎都已过时。我想 API 自 3.4.x 以来发生了一些变化(我目前正在使用 3.9.1 和 Scala 2.13.1

我希望能够将我的路线拆分到多个文件中,以便让事情井井有条。例如,我想要一个 UserRoutes 文件,并为 TodoRoutes 创建一个单独的文件,这两个文件都可以在我的 ServerVerticle.

中使用

我发现这样做的唯一方法基本上是:

用户路线:

object UserRoutes {
    def createUser(context: RoutingContext): Unit = {
        // do work
    }
    def login(context: RoutingContext): Unit = {
        // do work
    }
}

ServerVerticle:

class ServerVerticle(vertx: Vertx) extends AbstractVerticle {
    override def start(): Unit = {
        val router: Router = Router.router(vertx)

        router.post("/user/new").handle(UserRoutes.createUser)
        router.post("/user/login").handle(UserRoutes.login)
        ....
    }
}

我真正想做的是:

object UserRoutes {
    // somehow get a reference to `router` or create a new one
    router.post("/user/new", (context: RoutingContext) => {
        // do work
    })
    router.post("/user/login", (context: RoutingContext) => {
        // do work
    })
}

我更喜欢这个的原因是这样更容易准确地看到 UserRoutes 中正在做什么,例如正在使用什么路径,需要什么参数等。

我尝试采用与 this example application 类似的方法,但显然这对于​​ Vertx API 是不可能的,因为它存在于 3.9?

最好的方法是什么?我错过了什么?大型 REST API 如何拆分它们的路由?

我想这样做的一种方法如下所示:

用户路由

class UserRoutes(vertx: Vertx) {
  val router: Router = {
    val router = Router.router(vertx)

    router.get("/users/login").handler(context => {
      // do work
    })

    router
  }
}

然后在ServerVerticle中:

...
server
    .requestHandler(new UserVerticle(vertx).router)
    .requestHandler(new TodoVerticle(vertx).router)
    .listen(...)

这很好地分解了内容,但我仍然需要找到一个合适的方法来避免在每个 ___Routes 文件中重复 cors 选项和内容。当然有很多方法可以做到这一点,但问题仍然存在:这是正确的方法吗?

此外,我真的可以混合最初问题中概述的方法的某些部分。 UserRoutes class 仍然可以有 createUser() 方法,我可以简单地在 apply() 调用或其他地方使用它。

子路由器是另一种方法,但 there are still some issues with this

如果每个 ___Routes 文件都可以创建自己的 Verticle,那就太好了。如果每组路由 运行 在它自己的线程上,这可以很好地加快速度。

说实话...在 Scala 中,有很多方法可以解决这个问题。但哪个是最好的,当我们想要的时候:

  • 逻辑组织
  • 利用 Vertx 的优势
    • 也许是子垂直?
    • 避免共享状态

我需要指导!选项太多不知道从何下手

编辑: Maybe it's best to avoid assigning each group of routes to a Verticle, and letting vertx do it's thing?