【问题标题】:How to exchange data from database in Microservices如何在微服务中交换数据库中的数据
【发布时间】:2021-07-31 20:05:23
【问题描述】:

我正在寻找有关微服务之间数据共享的建议。 我的应用有 3 个服务,但在这种情况下,我只需要在 2 个服务之间共享数据: -Main(处理请求,存储用户数据) -上传(接收文件并修改)

在用户可以向服务器发送文件之前,服务器必须验证用户是否存在以及他是否具有发送文件的权限。

我的想法是在主服务中使用 Nginx API 网关创建一个私有 API,以便上传服务可以发出 HTTP 请求并获取有关用户和权限的数据。是否有意义?还是有更简单的解决方案?我使用 express 和 postgresql。

【问题讨论】:

    标签: node.js database microservices backend


    【解决方案1】:

    这是一个很好的方法,但也许主要服务应该是身份验证服务器。

    我的意思是,为了确保用户拥有适当的权限来执行某项操作,您必须使用一些东西来识别用户并且不能更改的东西,这通常是使用签名令牌来实现的。

    此令牌由身份验证服务器在用户登录应用程序时创建,当它被传递给服务时,此服务可以检查身份验证服务器是否令牌有效并且由令牌标识的用户是否具有执行操作的正确权限。

    此过程与您之前解释的过程非常相似。在您的情况下,用户服务将是负责用户身份验证和授权的身份验证服务器,而上传服务是使用的服务

    【讨论】:

    • 感谢您的回答。我用 Redis 实现了一个会话。
    【解决方案2】:

    因为您有两个微服务(客户、文件上传)。

    与其他微服务通信的最佳方式是通过该 MS 公开的 HTTP 调用(GET、POST、DELETE、PATCH)。

    在您的情况下,客户微服务很少有像 GetCustomer、CreateCustomer、DeleteCustomer、PatchCustomer 这样的端点。在上传文件之前,您可以调用 GetCustomer API 来检查客户在系统中的存在。如果存在,则继续对文件数据进行进一步处理。

    正如 JArgente 所说,使用授权令牌对微服务端点进行身份验证和授权。在调用微服务时在 HTTP_Header 中传递该令牌并针对您的授权服务器进行验证。您可以编写拦截器,用于验证令牌。

    【讨论】:

    • 我解决的方法有点不同,但我不确定它是否安全。我现在实现了会话身份验证,上传服务使用用户 cookie 向客户发出请求,并检查用户和会话是否存在(它工作正常)。危险的部分是 Nginx。我尝试使用 API 网关限制对一些端点的访问,但找不到完美的解决方案。所以我在网关中创建了一个私有API路由并允许从私有网络172.16.0.0/12访问我希望这个解决方案没有漏洞。
    • 您可以创建两种类型的 API,公共的和私有的。公共 API 可以被最终用户调用,而私有 API 在内部被调用(不暴露给外部世界)。
    • 你能告诉我我应该如何正确地实现私有 api 吗?想到的第一个想法是在不暴露端口的情况下创建另一个 Nginx 容器?
    【解决方案3】:

    只要你的主服务器可以对用户进行身份验证,并验证用户是否通过身份验证,就可以实现 JWT 令牌。

    如果您的客户端已经在向您的主服务器发送 JWT 令牌,则可以使用相同的令牌与其他微服务进行通信。

    如果没有,您始终可以生成一个新的 JWT 令牌发送到您的微服务,而无需维护任何集中式数据库

    var token = jwt.sign({ user: 123 }, privateKey, { algorithm: 'RS256'});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2021-11-17
      • 2020-07-25
      • 2017-04-22
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多