微服务跨服务依赖
Micro Service cross service dependencies
为了简化我的情况,我目前有 3 个微服务。
- 身份验证
- 地点
- 库存
身份验证服务对用户进行身份验证并发回 JWT 访问令牌,我在其他服务中使用它。它是无状态的,并且一切正常。
我在定位服务中设置了位置以及其他一些东西,效果很好,符合预期。
但现在我在库存服务中,我需要添加一些库存,但它已链接到一个位置。我可以轻松地在 API 调用中传递 locationId,但我无法授权当前用户向该位置添加内容,除非我随后调用位置服务来验证这一点。
这会在彼此之间创建服务依赖关系,这是我要不惜一切代价避免的事情,否则你只会失去微服务的大部分好处。
验证当前用户是否有权访问该位置的推荐方法是什么?到目前为止我唯一想到的就是
- 获取位置 API 以发出另一个访问令牌,并附加声明他们可以访问哪些位置。
- 或者发布另一个完全独立的某种令牌,并通过 header 将其传递给库存微服务,以进行类似于 JWT 认证方式的验证。
编辑
正如下面提到的提供聚合根(或者我假设这意味着与 API 网关相同)它将提供另一个服务的第三个选项,以便与两者通信以提供信息。
但是它会留下第三个服务依赖于另外两个服务,所以我只是增加了我的服务依赖性。
你的微服务设计很糟糕。您正在建模(location
和 items
)1 class = 1 个微服务,这不是一个好主意。
您应该像 DDD
中的 Aggregate Roots
那样对微服务进行建模;即使有自己的限界上下文。因此,在您的情况下,您应该使用 location
、items
和 user
对 Aggregate Root
进行建模,以允许在 item addition user action
处检查域规则。这可能是,即在您的 Stock Context
.
中
当然,这并不意味着你不应该有一个 Wharehouse Context
你可以添加,修改 and/or 删除 locations
和(如果不需要依赖检查域规则) Aggregate Root
就是 Location class
。但这是另一个上下文中的另一个微服务。
这篇post应该能帮到你。它会给你带来巨大的惊喜!看完之后在你的脑海里。
虽然@jlvaquero 提供了上面的想法,但我只想列出我的实际解决方案是什么以及为什么。
然后归结为这个设置
现在验证是在网关级别完成的。我在这里唯一有一定程度不确定性的是,我现在正在验证服务之外的实体,该实体旨在负责该域。
库存服务只是接受允许用户附加到该位置。但考虑到位置和用户验证在服务域之外,它不应该关心该验证。
网关应该只做认证而不做授权。授权在服务内部处理,因为服务只维护谁可以访问它。我将获取库存服务以获取用户有权访问的位置列表。
整个编排将在 UI 级别进行,以便库存服务不会对位置服务建立硬依赖。
这是一种方法 - 不确定是否适合您。
为了简化我的情况,我目前有 3 个微服务。
- 身份验证
- 地点
- 库存
身份验证服务对用户进行身份验证并发回 JWT 访问令牌,我在其他服务中使用它。它是无状态的,并且一切正常。
我在定位服务中设置了位置以及其他一些东西,效果很好,符合预期。
但现在我在库存服务中,我需要添加一些库存,但它已链接到一个位置。我可以轻松地在 API 调用中传递 locationId,但我无法授权当前用户向该位置添加内容,除非我随后调用位置服务来验证这一点。
这会在彼此之间创建服务依赖关系,这是我要不惜一切代价避免的事情,否则你只会失去微服务的大部分好处。
验证当前用户是否有权访问该位置的推荐方法是什么?到目前为止我唯一想到的就是
- 获取位置 API 以发出另一个访问令牌,并附加声明他们可以访问哪些位置。
- 或者发布另一个完全独立的某种令牌,并通过 header 将其传递给库存微服务,以进行类似于 JWT 认证方式的验证。
编辑
正如下面提到的提供聚合根(或者我假设这意味着与 API 网关相同)它将提供另一个服务的第三个选项,以便与两者通信以提供信息。
但是它会留下第三个服务依赖于另外两个服务,所以我只是增加了我的服务依赖性。
你的微服务设计很糟糕。您正在建模(location
和 items
)1 class = 1 个微服务,这不是一个好主意。
您应该像 DDD
中的 Aggregate Roots
那样对微服务进行建模;即使有自己的限界上下文。因此,在您的情况下,您应该使用 location
、items
和 user
对 Aggregate Root
进行建模,以允许在 item addition user action
处检查域规则。这可能是,即在您的 Stock Context
.
当然,这并不意味着你不应该有一个 Wharehouse Context
你可以添加,修改 and/or 删除 locations
和(如果不需要依赖检查域规则) Aggregate Root
就是 Location class
。但这是另一个上下文中的另一个微服务。
这篇post应该能帮到你。它会给你带来巨大的惊喜!看完之后在你的脑海里。
虽然@jlvaquero 提供了上面的想法,但我只想列出我的实际解决方案是什么以及为什么。
然后归结为这个设置
现在验证是在网关级别完成的。我在这里唯一有一定程度不确定性的是,我现在正在验证服务之外的实体,该实体旨在负责该域。
库存服务只是接受允许用户附加到该位置。但考虑到位置和用户验证在服务域之外,它不应该关心该验证。
网关应该只做认证而不做授权。授权在服务内部处理,因为服务只维护谁可以访问它。我将获取库存服务以获取用户有权访问的位置列表。
整个编排将在 UI 级别进行,以便库存服务不会对位置服务建立硬依赖。
这是一种方法 - 不确定是否适合您。