【问题标题】:Best way to keep Identity data synchronized over microservices?通过微服务保持身份数据同步的最佳方式?
【发布时间】:2021-07-29 19:40:41
【问题描述】:

我们实现了如下架构:

  1. 身份服务器 4:我们将其用作身份验证/授权服务,我们有两个内部客户端,用户在身份上被重定向以登录/注册。

  2. Ocelot API Gateway:是一个简单的网关,这个、Identity 和两个前端客户端是我们唯一直接暴露在网络上的服务。我们的前端调用网关,充当我们微服务的某种代理。它还检查用户的授权。

  3. 微服务:在这个网关后面有 6 个微服务,显然负责各种事情。其中一个微服务负责处理用户信息。

现在我们的问题是,每当用户在 Identity 上注册时,我们都会通过 rabbit 发送消息来更新用户微服务。但我们也需要做相反的事情:每当用户更新他的姓名或姓氏时,我们必须在用户微服务中更改它并通知身份。

关于此类问题的最佳做法是什么?

我们曾考虑在 rabbit 中仅通过队列监听身份,但这意味着来自身份的信息流将是双向的,这可能是一个问题。

我们还考虑更改“更新配置文件”消息的“接收者”,将其发送到身份,最终将更新姓名和姓氏,并通过 rabbit 将信息转发到我们的微服务,但这意味着:

  1. Identity 将收到一个巨大的有效负载,并且将有效地使用该有效负载的两个字段。

  2. 此方法将不再位于网关后面。

我们也在考虑不关心身份中保存的姓名和姓氏,并将它们从身份中的数据库中完全删除。

您对此有何看法?

【问题讨论】:

    标签: c# architecture microservices identityserver4 gateway


    【解决方案1】:

    一个选项如下:

    您可以向访问令牌添加用户名声明。然后每个接收访问令牌的服务都会将其与自己的数据库进行比较,如果不同则更新。这样您就不需要在服务之间进行任何单独的后台通信。保持简单!

    【讨论】:

    • 这是一个很酷的想法,但它并不能解决更改姓名和姓氏的问题。从客户端我应该能够做到,但这样做我应该更新显然不可能的访问令牌,除非我再次联系我的身份服务器。此外,这仍然意味着某些数据库将不同步,直到有人打电话给他们。这也可以防止一个人更改其他人的姓名和姓氏。
    • 也许后退一步,问问自己这是否真的是一个问题,不同服务的名称略有不同?我的意思是什么时候重要?当用户下订单时,您可以在订单中包含客户姓名,然后记住这一点。在订单之间,您是否真的关心名称是否在所有地方都 100% 相同?服务甚至需要知道名称吗?
    猜你喜欢
    • 2017-05-24
    • 2013-04-26
    • 1970-01-01
    • 2020-01-15
    • 2012-05-16
    • 2011-02-13
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多