我正在考虑在我的微服务上使用api网关。但是有一些架构问题我没有明确的答案,所以我希望得到社区的意见。如果你能分享你对好的和坏的做法的想法,那也很棒。因此,为了使这个问题易于阅读,我有两个主要部分"问题"和"详细信息"
问题主要在于什么是网关:它只是api用户和微服务之间的桥梁。或者它是微服务的主持人?请参阅"网关实施策略"了解更多信息。
如果我选择使用亚马逊API网关,并回答上一个问题将是"网关应该充当微服务的主持人"。我需要通过亚马逊lambdas处理请求/响应转换和授权,这意味着我将在网关下面有另一层。所以问题是:拥有这种架构是一种好习惯吗?
我们的系统中有以下微服务
端点GET / api / resources / {dataId} / admin-endpoint
标头 - 授权:不记名令牌
只有具有ADMIN角色的用户才能访问此端点(如果没有该角色的用户请求,将返回403 http状态并返回响应)。
请注意,在处理请求之前,必须由AuthService验证令牌。处理完请求后(如果出现非错误的http状态),AuthService必须刷新令牌(响应必须包含刷新的令牌)
端点GET / api / resources / {dataId} / user-endpoint
标头 - 授权:不记名令牌
具有任何角色的用户可以访问此端点
端点POST / api / auth / login
标头 - 授权:不记名令牌
body - {"用户名" :字符串,"密码" :String}
验证用户:如果成功签名,授权令牌将作为响应标头(承载JWT令牌)返回。如果验证失败,将返回401 http状态
端点POST / api / auth / logout
标头 - 授权:不记名令牌
使授权令牌无效(通过在适当的表中存储令牌),以便用户无法使用给定的令牌访问受保护的api
端点GET / api / auth / validate
标头 - 授权:不记名令牌
验证给定的令牌(必须在ServiceA中处理请求之前调用。有关验证检查,请参阅附录-A
回复正文 - {"角色" :,"用户名" :String}
使用此策略,ServiceA和AuthService在网关中注册为路由,在处理请求之前不会进行其他请求转换。
ServiceA直接与AuthServer进行协商以进行授权和令牌验证。
赞成
缺点
使用此策略,在将请求传递给ServiceA之前,api-gateway将使用AuthServer处理令牌验证。当ServiceA提供非错误响应时,它还将处理令牌刷新
赞成
缺点
答案 0 :(得分:1)
以下评论中回答了许多提出的问题: Should API gateway be responsible for authorisation? 另请查看已接受答案的评论。
答案 1 :(得分:0)
在我的微服务经验中,我了解到应该有仅拥有业务逻辑的核心微服务,而应用程序逻辑应在其他地方实现。 API网关是将外部世界与内部微服务生态系统联系起来的中央服务,是放置大部分资源的好地方。...以及是否需要更改应用程序逻辑(例如,您希望对某些应用启用基本身份验证)一套受限的api上的客户端),您随时可以向您的体系结构添加另一个API网关
通常,api网关不是负载均衡器或路由器。...是可以做所有事情的微服务。重要的是架构师让他们做正确的事