Architecture API网关或特定服务中的职责

Architecture API网关或特定服务中的职责,architecture,microservices,separation-of-concerns,Architecture,Microservices,Separation Of Concerns,我在服务之间划分责任时遇到问题 示例场景 假设我们减少了以下服务数量,通过RabbitMQ相互通信: API服务。所有业务逻辑的单个HTTP入口点 用户服务。它处理用户逻辑 要实现用户创建功能:我应该在API或用户服务中实施业务限制吗 例如,如果只有管理员可以创建“isAdmin”属性设置为true的用户,我会想到以下选项: 暂定解决办法 签入API服务 API服务检查用户是否已授权,如果已授权,则将操作发送给用户服务。操作到用户服务 优势:用户服务更加灵活。如果其他服务希望在将来创建用户,

我在服务之间划分责任时遇到问题

示例场景 假设我们减少了以下服务数量,通过RabbitMQ相互通信:

  • API服务。所有业务逻辑的单个HTTP入口点
  • 用户服务。它处理用户逻辑
要实现用户创建功能:我应该在API或用户服务中实施业务限制吗

例如,如果只有管理员可以创建“isAdmin”属性设置为true的用户,我会想到以下选项:

暂定解决办法 签入API服务 API服务检查用户是否已授权,如果已授权,则将操作发送给用户服务。操作到用户服务

优势:用户服务更加灵活。如果其他服务希望在将来创建用户,则不限制执行它想要的任何操作(例如,创建没有“创建者用户”的用户)。数据也在早期得到验证

缺点:如果业务逻辑太常见,我必须在多个点重复检查。我有用户拆分的业务逻辑

登记用户服务 用户服务检查授权并向API返回错误。API将该错误传递给客户端


是否存在良好的实践?你以前有没有遇到过这种困境?它是如何工作的?

领域驱动设计的角度来看,授权应该是一个单独的有界上下文。因此,授权检查应该在
用户管理范围的上下文之外进行。因此,在最简单的实现中,您可以使用一些Api服务来执行实际的检查,从应用程序层调用。如果当前经过身份验证的用户具有所需的权限(例如
CanCreateNewUsers
),则允许调用
Users administration bounded context
,否则将被错误拒绝

更复杂的/DDD解决方案是在两个有界上下文之间使用反破坏层


顺便说一句,我建议您在进行实际检查时使用权限而不是角色。从
域驱动设计
的角度来看,您可以在
授权受限上下文中使用角色,授权应该是一个单独的受限上下文。因此,授权检查应该在
用户管理范围的上下文之外进行。因此,在最简单的实现中,您可以使用一些Api服务来执行实际的检查,从应用程序层调用。如果当前经过身份验证的用户具有所需的权限(例如
CanCreateNewUsers
),则允许调用
Users administration bounded context
,否则将被错误拒绝

更复杂的/DDD解决方案是在两个有界上下文之间使用反破坏层

顺便说一句,我建议您在进行实际检查时使用权限而不是角色。您可以在
授权受限上下文中使用角色