微服务服务到服务通信须知原则
Microservices Service-to-Service-Communication Need-to-Know principle
在调用服务的 API 时,是否有任何最佳实践来最小化(内部)微服务之间的数据交换(又名需要知道)?
如何实现这样的目标:
共有三项服务:
- 用户
- 通知(假设只是电子邮件)
- 运费
当通知服务需要用户的电子邮件地址时,它会查询用户服务的 API 并且应该获取电子邮件(而不是完整的数据集)。
当送货服务需要用户的送货地址时,它会查询用户服务的 API 并且应该获取送货地址(而不是完整的数据集)。
问题:
是否应该使用某种 ACL 在用户服务内部处理(允许 "XYZ" 查看什么服务)?
使用 JWT 进行身份验证,根本不需要交换密钥,因此在设置阶段可以在团队之间讨论这些 ACL。
Should this be handled inside the user service with kind of an ACL
我认为这是最好的选择。您可以将实际授权委托给一个单独的服务,用户服务可以使用调用者的身份和调用者正在进行的 "claim"(例如 "I am allowed to see Email Address for User")来调用该服务。索赔可以在每次通话的基础上进行评估。
但是,您是否真的需要查询用户服务是有争议的。这将意味着对您的设计进行更改,但想象一下,通知服务已经了解用户,例如用户 ID 和电子邮件地址,那么通知服务将不需要查询任何内容就可以完成它的工作。
为了让通知服务已经拥有用户数据,该数据必须在过去的某个时间点发送到通知服务。执行此操作的好时机是首次创建用户时,或任何时候更改用户详细信息时。分发此类信息的最佳方式是采用事件消息的形式,尽管您可以基于到通知服务的 http POST 进行分发。
在调用服务的 API 时,是否有任何最佳实践来最小化(内部)微服务之间的数据交换(又名需要知道)?
如何实现这样的目标:
共有三项服务:
- 用户
- 通知(假设只是电子邮件)
- 运费
当通知服务需要用户的电子邮件地址时,它会查询用户服务的 API 并且应该获取电子邮件(而不是完整的数据集)。
当送货服务需要用户的送货地址时,它会查询用户服务的 API 并且应该获取送货地址(而不是完整的数据集)。
问题:
是否应该使用某种 ACL 在用户服务内部处理(允许 "XYZ" 查看什么服务)?
使用 JWT 进行身份验证,根本不需要交换密钥,因此在设置阶段可以在团队之间讨论这些 ACL。
Should this be handled inside the user service with kind of an ACL
我认为这是最好的选择。您可以将实际授权委托给一个单独的服务,用户服务可以使用调用者的身份和调用者正在进行的 "claim"(例如 "I am allowed to see Email Address for User")来调用该服务。索赔可以在每次通话的基础上进行评估。
但是,您是否真的需要查询用户服务是有争议的。这将意味着对您的设计进行更改,但想象一下,通知服务已经了解用户,例如用户 ID 和电子邮件地址,那么通知服务将不需要查询任何内容就可以完成它的工作。
为了让通知服务已经拥有用户数据,该数据必须在过去的某个时间点发送到通知服务。执行此操作的好时机是首次创建用户时,或任何时候更改用户详细信息时。分发此类信息的最佳方式是采用事件消息的形式,尽管您可以基于到通知服务的 http POST 进行分发。