我实际上在研究微服务,而且我遇到了问题。
上下文
我开发了两个微服务:
/planning/{day}/{userId} or /planning/{startDate}/{endDate}/{idUser}
问题
如果只允许通过用户服务访问规划信息而不同时使用这两项服务,我该怎么做?知道以后可以从其他地方访问计划服务,但现在不能访问。
如何从MySQL数据库中访问与用户对应的计费服务的帐单信息?我知道微服务没有耦合,这一点是杀了我,因为它必须以某种方式耦合?就像在结算中引用idUser
一样?另外,我怎么知道我应该从我的API中公开哪个账单?更准确地说,微服务如何在它们之间进行通信而不是耦合?
如何在不向其他服务复制身份验证服务的身份验证请求的情况下创建身份验证?
答案 0 :(得分:5)
这里要认识到的重要一点是,在实现用户身份验证,用户授权和用户会话管理解决方案时,微服务架构解决方案与任何其他形式的分布式之间没有显着的概念差异系统架构。
从概念上讲,解决方案将是Kerberos protocol的实现,其中传递“票证”(或称为“令牌”,因为它更常见于今天)的概念被传递以建立用户的身份。
因此,在您的情况下,您的用户管理服务将充当您的后端身份验证和授权服务器,所有其他服务都需要注意。您的用户管理服务将负责颁发和验证用户令牌,以确定用户的身份和角色。
如果只允许通过用户服务访问规划信息而不连接两个服务,我该怎么做?
当用户尝试访问.Net服务时,您的服务必须依靠您的用户管理服务来建立用户的身份。换句话说,您的.Net服务需要知道您的用户管理服务在哪里(即其URL)。您可以使用etcd或nats等工具将用户管理服务的位置传播到您的生态系统的其他部分,而无需将微服务与其耦合。
如何从Mysql数据库中访问与用户对应的计费服务的结算信息?
最简单的解决方案是将(单个?)密钥(例如用户ID)作为查询服务的URL中的查询参数传递。当然,您的结算服务必须以这样的方式实现,以期将密钥附加到URL。如果您需要包含其他密钥(例如,计费日期,订单状态等),您可以使用memcached或redis之类的内容在运行时存储这些信息。当然,现在你必须考虑将这些单点故障添加到你的生态系统中的权衡: - )
如何创建身份验证而不从其他服务复制身份验证服务的身份验证请求?
同样,一旦用户通过身份验证,其所有身份信息都可以存储在memcached或redis之类的内容中,以避免重复身份验证和授权过程。
答案 1 :(得分:4)
另一种方法是构建另一个微服务,通过身份验证/授权保护对其他服务的访问。 这与API网关模式有关,此处还有其他信息:http://microservices.io/patterns/apigateway.html。 基本上,您的系统只有一个入口点,您可以使用oauth或json Web令牌来处理客户端身份验证。
微服务之间的安全访问也可以通过http请求上的附加头和令牌(类似“内部”身份验证)来实现。
在我看来,微服务不应该承担这个责任,因为你可能不得不在你的应用程序中共享/复制auth逻辑。
另一方面,将ID作为“外键”共享是解耦相关数据的好方法。