我目前正在阅读很多有关微服务的内容,但我仍然不了解某些部分。我做了以下抽奖:
每个微服务有2个访问:
如果我想登录,我可以向我的身份验证服务发送Http请求。但是,如果我想访问需要您已连接的Stuff服务呢?
假设用户想要显示数据库STUFF中可用的东西,服务Stuff将首先检查"令牌"连接用户的权利是正确的,通过与身份验证服务进行交换,然后返回内容或者登录需要请求"。
所以我不明白的是,如果需要连接客户端的每个服务都需要与身份验证交换,那么它将创建巨大的互联网流量以检查每个用户请求。所以我虽然关于为每个服务制作一个身份验证服务,但由于我应该只有一个数据库,那么它是否会减慢流量?
另外,如果我理解,每个微服务应该在不同的服务器上,而不是同一个服务器?
我希望我很清楚,不要犹豫,要求提供更多细节!
提前致谢:)
最高
基于@ notionquest的答案:
所以它看起来应该更合适吗?
另外,根据彼得的评论,每个服务都可以实现自己的中间件(如上所述的JWT),因此API网关只是一个"传递"。但是,我不觉得这对我来说很好,因为每个服务都会对每个内部交换进行代币检查,不是吗?
对于这些东西来说,它很容易,因为它只检查一次令牌。现在,让我们说,在用户拿到东西后,他选择一个并想购买它。那么"购买服务"将调用stuff服务以验证项目的价格,但是......它必须检查用户令牌,因为这些东西是"在经过身份验证的访问",所以这意味着" ;购买"服务和"东西"服务都检查令牌,这增加了额外的检查。
我虽然关于服务之间的内部保证访问但是值得吗?
另外,也许你说为每个服务实现中间件,因为他们有REST访问权限,但API网关只会破坏访问REST的想法
答案 0 :(得分:6)
此问题有多种解决方案可供选择。其中一个解决方案是API Gateway pattern。
API Gateway是所有服务的单一入口点。因此,您可能不需要为每个服务单独缓存。
请参阅此page中的图表。
答案 1 :(得分:2)
除了@notionquest回答之外,还有另一种不涉及API网关的方法;
您可以在所有服务中共享SESSION_SECRET
,因此您的身份验证服务的唯一任务是验证数据库的用户名和密码,然后使用SESSION_SECRET
加密此信息并返回{{ 3}}。所有其他服务都不需要与身份验证服务进行交互,只需使用SESSION_SECRET
检查jwt令牌是否有效(可以解密)。
然后你有另外两个选择;
将所需的所有用户数据存储在令牌中 - 这将增加从客户端传输到微服务的数据量。根据此信息的大小,这可能会令人望而却步
您只能存储userId,并根据需要为每个微服务请求其他数据,具体取决于您所描述的数据产生问题的频率/大小。
请注意,您并不总是能够使用此方法,但根据您的具体情况和要求,考虑到这种架构可能会很有用。
还要记住,旋转SESSION_SECRET
可能很棘手(尽管出于安全原因需要)。 AWS刚刚发布了一项名为jwt token的服务,因此简单的一个想法是让您的微服务定期查询当前有效SESSION_SECRET
这样的服务,而不是将此值硬编码或作为环境变量。