2

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

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

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

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

用户路线:

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

服务器垂直:

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,例如正在使用什么路径,需要什么参数等。

我尝试对这个示例应用程序采用类似的方法,但显然这对于​​ Vertx API 是不可能的,因为它存在于3.9?

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

4

1 回答 1

0

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

用户路由

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(...)

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

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

子路由器是另一种方法,但仍然存在一些问题

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

说实话…… Scala 一如既往有很多方法可以解决这个问题。但当我们想要时,这是最好的:

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

我需要指导!有很多选择,我不知道从哪里开始。

编辑: 也许最好避免将每组路由分配给 Verticle,让 vertx 来做这件事?

于 2020-07-03T17:18:50.783 回答