微服务跨服务依赖

Micro Service cross service dependencies

为了简化我的情况,我目前有 3 个微服务。

  1. 身份验证
  2. 地点
  3. 库存

身份验证服务对用户进行身份验证并发回 JWT 访问令牌,我在其他服务中使用它。它是无状态的,并且一切正常。

我在定位服务中设置了位置以及其他一些东西,效果很好,符合预期。

但现在我在库存服务中,我需要添加一些库存,但它已链接到一个位置。我可以轻松地在 API 调用中传递 locationId,但我无法授权当前用户向该位置添加内容,除非我随后调用位置服务来验证这一点。

这会在彼此之间创建服务依赖关系,这是我要不惜一切代价避免的事情,否则你只会失去微服务的大部分好处。

验证当前用户是否有权访问该位置的推荐方法是什么?到目前为止我唯一想到的就是

  1. 获取位置 API 以发出另一个访问令牌,并附加声明他们可以访问哪些位置。
  2. 或者发布另一个完全独立的某种令牌,并通过 header 将其传递给库存微服务,以进行类似于 JWT 认证方式的验证。

编辑

正如下面提到的提供聚合根(或者我假设这意味着与 API 网关相同)它将提供另一个服务的第三个选项,以便与两者通信以提供信息。

但是它会留下第三个服务依赖于另外两个服务,所以我只是增加了我的服务依赖性。

你的微服务设计很糟糕。您正在建模(locationitems)1 class = 1 个微服务,这不是一个好主意。

您应该像 DDD 中的 Aggregate Roots 那样对微服务进行建模;即使有自己的限界上下文。因此,在您的情况下,您应该使用 locationitemsuserAggregate Root 进行建模,以允许在 item addition user action 处检查域规则。这可能是,即在您的 Stock Context.

当然,这并不意味着你不应该有一个 Wharehouse Context 你可以添加,修改 and/or 删除 locations 和(如果不需要依赖检查域规则) Aggregate Root 就是 Location class。但这是另一个上下文中的另一个微服务。

这篇post应该能帮到你。它会给你带来巨大的惊喜!看完之后在你的脑海里。

虽然@jlvaquero 提供了上面的想法,但我只想列出我的实际解决方案是什么以及为什么。

然后归结为这个设置

现在验证是在网关级别完成的。我在这里唯一有一定程度不确定性的是,我现在正在验证服务之外的实体,该实体旨在负责该域。

库存服务只是接受允许用户附加到该位置。但考虑到位置和用户验证在服务域之外,它不应该关心该验证。

网关应该只做认证而不做授权。授权在服务内部处理,因为服务只维护谁可以访问它。我将获取库存服务以获取用户有权访问的位置列表。

整个编排将在 UI 级别进行,以便库存服务不会对位置服务建立硬依赖。

这是一种方法 - 不确定是否适合您。