跨不同微服务的数据验证

Mat*_*llo 6 java architecture rest spring-boot microservices

我已经阅读了很多有关它的主题,但是仍然没有找到更好的方法。

我有一个User。一个User可能有很多Posts。用户和帖子是不同的微服务。我正在使用Spring Boot。

当前端调用我的Posts微服务向发送POST请求时/posts/user/1,我需要检查给定userId(1)是否存在于Users数据库中。如果否,则抛出异常,告知前端用户不存在。如果是,则将给定的请求正文作为插入Post

问题是:我应该如何在后端检查此信息?我们不想让前端承担此责任,因为javascript是客户端,并且恶意用户可以绕过此检查。

选项:

  • 微服务之间的REST通信。(发布微服务呼叫用户微服务询问给定的id是否在他的身边)
  • 向Posts微服务授予对Users微服务数据库的访问权限

我知道它们之间的通信会产生耦合,但是我不确定让Posts访问Users数据库是否是最佳选择。

随时提出任何选择。

Amo*_*ble 7

您可选择做之间的进程间通信PostUser通过微服务RESTful的方法。

如果您只想检查资源是否存在并且不希望任何主体响应,那么您应该更喜欢使用HEADhttp 方法。因此,您托管在User微服务上的API 端点将如下所示 -

HEAD  user/{userId}
Run Code Online (Sandbox Code Playgroud)

Post微服务调用此 API 。

如果用户存在则返回 200 / OK

如果用户不存在,则返回 404 / Not Found

单击此处此处获取有关HEAD方法使用和用例的更多详细信息。


Anu*_*nay 4

对于这个非常特殊的用例,如果您有安全层,您可以(应该)使用用户访问令牌,以确保为正确的用户处理该请求,这可以通过验证令牌并依赖于事实上,如果用户有令牌,他就存在。(因为它与用户是否存在无关)

对于除此之外的任何逻辑,假设您想检查他是否被允许发帖或其他此类限制,则需要调用用户服务。

谈到授予对数据库的访问权限,这将违反微服务的一项基本准则。这样做将在您和用户之间形成紧密的耦合。在这种情况下可以调用用户服务,用户服务可以决定如何处理该请求。用户服务本身应该提供通过缓存或其他机制来回答 SLA 内的查询的方法。

您可以探索的另一件事是BFF(前端的后端)您正确地说您不应该向前端公开后端服务或在其中添加任何逻辑,但通常前端页面可能不愿意接受同一页面上的内容通过 n 应答不同的后端服务,可能有一些逻辑来缝合此类查询,这就是您可以利用 BFF 的地方。后端服务器(在我的例子中是节点),它需要前端对给定页面仅进行一次调用(或更少的调用),同时隐藏后端服务。