跨不同微服务的数据验证

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

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

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

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

选项:

  • 微服务之间的 REST 通信。(发布微服务调用用户微服务,询问给定的ID是否存在于他这边)
  • 授予帖子微服务对用户微服务数据库的访问权限

我知道它们之间的通信将产生耦合,但我不确定授予Posts访问用户数据库的权限是否是最佳选择。

请随时建议任何选项。


答案 1

您可以选择通过方法在微服务之间进行进程间通信。PostUserRESTful

如果您只想检查资源的存在并且不希望任何主体作为响应,那么您应该使用http方法进行推断。因此,托管在微服务的 API 终结点将如下所示 -HEADUser

HEAD  user/{userId}

从微服务调用此 API。Post

如果用户存在,则返回 200 / 确定

如果用户不存在,则返回 404 / 未找到

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


答案 2

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

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

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

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


推荐