2015-04-14 392 views
5

我实际上在研究微服务,而且我正面临一个问题。 微服务通信

  • 规划管理,基于与SQL Server数据库ASP.NET

    • 用户管理,基于Spring,与MySQL数据库:

      语境

      余米开发两种微服务。此服务的唯一访问点是API列出了一些RESTful端点,如/planning/{day}/{userId} or /planning/{startDate}/{endDate}/{idUser}

    • 计费管理,基于MongoDB的Node.Js。

    问题

    1. 我能做些什么,仅允许通过访问不耦联这两个服务的用户的服务计划的信息?知道计划服务可以稍后从其他地方访问,但不是现在。

    2. 如何从MySQL数据库访问与用户对应的账单服务的账单信息?我知道微服务不耦合,这一点正在杀死我,因为它必须以某种方式耦合?像在帐单中引用idUser一样?否则,我应该如何知道我应该公开哪些帐单?更确切地说,微服务如何在它们之间进行通信,而不需要耦合?

    3. 如何创建身份验证而不会将身份验证请求复制到其他服务的身份验证服务?

  • +0

    如果您喜欢,请考虑将答案标记为已接受。谢谢! –

    回答

    5

    在这里认识到最重要的事情是,当涉及到实现用户认证,用户授权和用户会话管理解决方案,也有微服务架构和任何解决方案之间没有显著的概念差异其他形式的分布式系统架构。

    从概念上讲,解决方案将是Kerberos protocol的实现,其中“票证”(或“标记”,因为它更常被称为今天)的概念被传递以建立用户的身份。

    因此,在您的情况下,您的用户管理服务将作为您的后端身份验证和授权服务器,所有其他服务都需要注意。您的用户管理服务将负责发布和验证用户令牌,以建立用户的身份和角色。

    我该怎么做只允许通过用户服务访问计划信息而不需要两个服务?

    当用户试图访问您的.Net服务时,您的服务将不得不依赖您的用户管理服务来建立用户的身份。换句话说,您的.Net服务需要知道您的用户管理服务(即其URL)。您可以利用诸如etcdnats之类的工具将您的用户管理服务的位置传播到您生态系统的其余部分,而无需将您的微服务耦合到它。

    如何从Mysql数据库访问与用户对应的账单服务的账单信息?

    最简单的解决方案是在帐单服务的URL中传递(single?)键(如用户标识)作为查询参数。当然,您的账单服务必须以这种方式实现,以期望将密钥添加到URL中。如果您需要包含其他密钥(例如,说明结算日期,订单状态等),也许可以使用类似于memcachedredis的东西在运行时存储这些信息。当然,现在你必须考虑将这些单点故障你的生态系统的取舍:-)

    如何不重复的认证请求的认证服务中创建的认证,从其他服务?

    同样,一旦用户被认证,其所有身份信息可以存储在像任memcachedredis,以避免重复的认证和授权过程。

    4

    另一种方法可能是构建另一个微服务,通过身份验证/授权来保护对其他服务的访问。 这涉及API网关模式,其他信息在这里:http://microservices.io/patterns/apigateway.html。 基本上你会有一个入口点到你的系统,你可以使用oauth或者json的web令牌来处理客户端的认证。

    微服务之间的安全访问也可以通过http请求(类型为“internal”auth)使用额外的头部和标记来实现。

    在我看来,微服务不应该有这个责任,因为你可能必须在你的应用程序中共享/重复授权逻辑。

    另一方面,将ID共享为“外键”是解耦相关数据的好方法。

    +1

    是的,这正是api网关所做的。问题是:如果用户尝试从主机端口访问帐单API,该怎么办?知道它是处理请求并调用authservice的api网关,似乎我有安全问题... :-) – mfrachet

    +0

    您可以通过阻止端口来限制对这些微服务的访问。或者,正如我所说的,您可以在受保护的服务之间拥有某种共享令牌。这实际上取决于你需要的安全粒度。如果部署了一组微型服务,则只能将80端口暴露给api网关。其余的应该从外面阻止。 – ronaldofs

    +0

    您可以使用结算服务内的组合来始终通过身份验证服务。示例:http://stackoverflow.com/questions/31044380/microservices-authentication/42633198#42633198 –