如何在 spring 和 vertx 应用程序中维护每个请求的作者姓名?

how to maintain author name per request in spring and vertx application?

我主要用 java(使用 spring 和休眠)编写的微服务很少。我将 vertx 用于 rest api 和非阻塞事件。 在每个 API 调用中都有一个 jwt 令牌,其中包含非常基本的用户信息,如用户名。我可以从 vertx RoutingContext 的 jwt 令牌中提取用户名。

现在我想在休眠实体发生变化或保存新实体时审核数据库中的用户名。但是在将事件传递给处理数据库操作的 worker verticles 之后,我没有用户名,除非我在每个请求中都将它传递到 eventbus 中。 我想知道我们是否可以有任何上下文,在请求的生命周期中,我可以在其中将用户名和访问权限保留在 worker verticle 中。

Vert.x 构建时考虑了异步和非阻塞范式,上下文分离因此不需要线程同步并避免这种开销

因此,不建议在 worker 之间共享状态,

我建议深入消息驱动领域并让功能(工人)尽可能纯粹,即向每个工人传递他完成工作所需的所有数据,发送 username or/and 工作人员需要的任何其他数据

您不必太担心事件性能,它非常高效并且专为高负载而构建

另一种选择是使用共享数据存储,所有工作人员都知道并可以以高效的异步方式在他们之间共享状态,vert.x 已实现内部 sharedData,您可以使用它, 虽然很基础

因此,如果您需要具有更多功能的数据存储,请查看内存数据网格中的 Hazelcast,它可以为您提供更多功能,并且仍然可以作为分布式快速和异步数据存储供所有人使用节点,(已经很好地与 Vert.x 作为分发管理器一起使用)

您可以使用集群范围的 AsyncMap 在请求和节点之间存储数据。

类似于:

vertx.sharedData().<String, String>getAsyncMap("mymap", res -> {
  if (res.succeeded()) {
    res.result().put("foo", "bar", resPut -> {...});
  }
});

更多信息in ref-doc