我正在使用node.js实现基于微服务的应用程序。在搜索有关如何实现api网关的示例时,我遇到了以下文章,它似乎提供了一个关于实现api网关的示例:https://memz.co/api-gateway-microservices-docker-node-js/。虽然找到在node.js中实现api网关模式的例子到目前为止似乎有点难以实现,但本文似乎是一个非常好的例子。
有一些项目仍然不清楚,我仍然有找到doc的问题。上。
1)安全性是应用程序的主要项目。我正在开发,我很难看到认证应该发生在哪里(即使用护照,我应该在api网关中添加认证项目,并将jwt令牌与请求一起传递给相应的微服务,因为用户的登录信息是某些活动需要什么?这里唯一的问题似乎是所有的微服务都需要护照才能解密jwt令牌以获取用户的个人资料信息。除了通过api网关外,微服务在技术上是否是外部世界无法访问的因为这似乎是目的?
2)如果我需要在每个服务器上使用docker镜像扩展到多个服务器,这种情况会如何变化?这将如何影响负载平衡,因为似乎某些东西必须处于更高级别以处理负载平衡?
答案 0 :(得分:9)
我可以说,这在很大程度上取决于您的应用要求。真。 我现在已经超过了使用从中型到大型系统的多种语言的5年生产微服务经验。
他们都没有共享相同的要求,并且没有深入了解您的需求以及您的业务(产品)要求,我很难知道什么是正确的答案,顺便说一下我&# 39;尝试分享一些经验,帮助你做好准备。
理想情况下,您希望将安全性封装在外部服务中,以便您可以更快地更新和应用新策略。如果您发现系统中存在违规行为,或者团队中的某个人无意中将某个密钥(或证书)推送到外部服务,您也可以弃用所有现有令牌。
您可以处理每个服务的身份验证或使用边缘的newtwork工具(例如API网关)。选择如何处理它是因为每个人都有自己的特权:
选择API网关,您的服务将保持更轻,并且不需要了解有关身份验证步骤的任何信息,但在某些时候您肯定需要知道经过身份验证的用户是谁,并且您需要一些简单的引用它(JSON记录,"用户配置文件"服务的链接或ID)。如何做到这一点符合您的要求,我们甚至可以更深入地讨论适用于您的案例的每种可能选择的不同利弊。
选择在服务级别处理它需要您(和您的团队)更好地了解正在发生的安全过程(您可以使用一个好的库隐藏它)并且您需要给它们来自您的安全团队的支持(也可能是您自己,因为您知道实施安全性的服务越多,您需要考虑的事项就越多,以避免添加不必要的功能)。这里最大的问题是你经常会停止你的任务来思考什么会帮助你解决这个特定的服务,你会被诱惑扩展你的身份验证服务(和上帝,除非你真的知道你正在做什么,不要为认证目的添加一个不需要的电话。
有一件事很容易确定:你肯定需要考虑令牌(jwt,jwe或者,无论你的要求是什么)。
JWT有很好的好处,但是数据暴露在欺骗之中,所以永远不要把敏感数据或你不会公开分享的关于你的用户的内容(例如ID可能没问题,而安全问题或2FA的解决方案)不会)。 JWE是规范的加密形式。一个公共令牌(没有任何意义)需要一个后端来获取数据,但它的工作方式与cookie会话非常相似,数据不会离开您的服务器。
您需要自己定义服务的界限并帮自己一个忙:让每个服务边界清晰,定义和标准化。
尝试定义公共策略并标准化交互,我知道在这里添加队列可能更容易,在那里添加一个REST端点,在那里有一个RPC,但是你很快就会得到一堆IPC你不会能够处理,很快就会引起你的注意。
此外,如果您的业务解决方案非常繁重,我不认为自己做API网关,安全等等是个好主意。我会选择开源,社区支持(如果你有一些预算,甚至是公司支持的)和经过生产测试的解决方案。
根据定义,微服务架构是非常动态的,您将努力使其在每个部署版本之间保持不变,但除非您是一家大公司,否则您无法保留数千台服务器。这意味着您将发现仅在某些情况下出现的错误,这些错误在其他环境中无法发现(通常无法再现它们)。
通过选择自己开发整个堆栈,您同意必须在整个堆栈中处理维护和错误发现。因此,当您尝试加载具有25个服务交互的页面时,您知道它可能会因为以下错误而失败:您的API网关,您的安全实施,您的令牌解析器,您的用户帐户服务,您的业务服务A到N,您的数据库服务(如果有),数据库负载平衡(如果有的话),数据库实例。
我知道做任何事都很诱人,但要尽量保持平衡并做你需要做的事。通过遵循这条道路,您将考虑您的产品,我认为这是现在最重要的想法。
要完成我的答案,关于缩放问题: 这没关系。无论您选择哪种选择,它都可以无缝扩展:
API网关应该能够在后端池上工作(因此,从该服务器,您应该能够重定向到可以在需要时投入使用的N台后端计算机,甚至可以使用一些API来支持自动注册新实例,甚至简单地放置Elastic Load Balancer或HAproxy或等价物的IP,当你向它们添加后端时,它只会工作 - 你已经将多个IP问题从API网关移到了一层了)
如果您在服务级别处理身份验证(并且您有API网关),请参阅#1
如果您在服务级别处理身份验证(没有API网关),那么您需要查看堆栈中的其他级别:负载平衡(第3层或第7层)或DNS级别,您可以使用DNS的几个功能,可以使用不同的IP来回答,如果需要延迟分发,甚至可以使用Anycast等高级功能。
我知道这个答案引入了很多其他问题,但我真的试着回答你的问题。事实上,在规划微服务架构时,您需要了解和评估很多事情,而且如果没有在我办公室的每面墙上都印有非常书面的计划,我就不会写SLOC。
您经常需要精神集中并退出单一服务,以审查全球视野并检查一切正常。
我不想吓唬你,我宁愿让你想到成功。 我只是希望你确保在决定从头开始做所有事情之前正确评估了所有可能性。
P.S。如果您选择使用API网关,请确保将服务限制为仅通过它接受请求。在同一台机器上开始监听localhost,在多台机器上,根据您的操作系统,您需要一些高级网络规则。
祝你好运!