【问题标题】:Vertx Web: How to split and organize routes across multiple files?Vertx Web:如何跨多个文件拆分和组织路由?
【发布时间】:2020-07-03 16:44:11
【问题描述】:

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

但是,针对我的具体问题的示例和文档似乎都已过时。我猜自 3.4.x 以来 API 发生了一些变化(我目前正在使用 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 采取类似的方法,但显然这对于​​存在于3.9 中的 Vertx API 来说是不可能的?

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

【问题讨论】:

标签: scala vert.x vertx-verticle java-vertx-web


【解决方案1】:

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

用户路由

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 类仍然可以有 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?

【讨论】:

猜你喜欢
  • 2018-03-05
  • 2011-11-10
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2014-05-01
  • 2017-05-14
相关资源
最近更新 更多