我正在使用node.js.实现一个基于微服务的应用程序在搜索如何实现api网关的示例时,我遇到了以下文章,它似乎提供了一个关于实现api网关的示例:https://memz.co/api-gateway-microservices-docker-node-js/.尽管到目前为止,在node.js中找到实现api网关模式的示例似乎有点困难,但这篇文章似乎是一个非常好的例子。
有几个项目还不清楚,我仍然有问题找到医生。在…上
1)安全性是应用程序的一个主要项目。我正在开发,我无法确定应该在哪里进行身份验证(即使用护照,我是否应该在api网关中添加身份验证项目并将jwt令牌连同请求一起传递给相应的微服务,因为某些活动需要用户的登录信息?这里唯一的问题似乎是所有的微服务都需要护照才能解密jwt令牌以获取用户的个人资料信息。html" target="_blank">微服务是否在技术上,除了通过api网关之外,外界无法访问,因为这似乎是目标?
2)如果我需要扩展到多个服务器,每个服务器上都有docker映像,这种情况会如何变化?这将如何影响负载平衡,因为似乎必须有更高级别的东西来处理负载平衡?
我可以说这在很大程度上取决于您的应用程序要求。真的。我现在已经超过了5年使用多种语言从中型到超大规模系统生产微服务的经验。
他们都没有相同的需求,如果不深入了解您的需求以及您的业务(产品)需求,就很难知道什么是正确的答案,顺便说一句,我将尝试分享一些经验,以帮助您实现正确的目标。
理想情况下,您希望将安全性封装在外部服务中,以便您可以更快地更新和应用新策略。此外,如果您在系统中发现漏洞,或者如果您的团队中有人无意中将某些密钥(或证书)推送到外部服务,您将能够弃用所有现有令牌。
您可以在每个服务上处理身份验证,也可以使用边缘工作工具(例如API网关)。谨慎选择如何处理,因为每个人都有自己的特权:
>
选择在服务级别处理它需要你(和你的团队)更好地了解正在发生的安全过程(你可以用一个好的库隐藏它),并且你需要你的安全团队为他们提供支持(顺便说一句,你也可能是你自己,你知道实现安全性的服务越多,你需要考虑的事情就越多,以避免添加不必要的功能)。这里最大的问题是,你经常会停止你的任务,去思考在这个特定的服务上有什么可以帮助你,你会被诱惑去扩展你的身份验证服务(上帝啊,除非你真的知道自己在做什么,否则不要添加一个不需要身份验证的调用)。
有一件事很容易确定:你肯定需要考虑代币(jwt、jwe或者,无论你的要求是什么)。
JWT有很好的好处,但数据会被欺骗,所以永远不要把敏感数据或你不会公开分享的用户信息放在里面(例如,ID可能没问题,而安全问题或2FA的解决方案不会)。JWE是规范的一种加密形式。一个公共令牌(没有任何意义)需要一个后端来获取数据,但它的工作原理很像cookie会话,数据不会离开服务器。
你需要为自己定义服务的边界,并帮自己一个忙:使每个服务边界干净、明确、标准。
尝试定义通用策略和标准化交互,我知道在这里添加队列、在那里添加RESTendpoint、在那里添加RPC可能会更容易,但很快你就会遇到一堆你将无法处理的IPC,很快就会引起你的注意。
此外,如果您的业务解决方案非常繁重,我认为自己做API网关、安全性等不是一个好主意。我会选择开源、社区支持(如果你有预算的话,甚至是公司支持)和经过生产测试的解决方案。
根据定义,微服务体系结构是非常动态的,您将努力在每个部署版本之间保持不变,但除非您是一家大公司,否则您无法努力保持数千台服务器的运行。这意味着您将发现只有在某些情况下才会出现的bug,而这些情况在其他环境中是无法发现的(通常无法重现)。
通过选择自己开发整个堆栈,您同意必须在整个堆栈中处理维护和错误发现。因此,当您尝试加载一个有25个服务交互的页面时,您知道它可能会因为以下错误而失败:您的API网关、您的安全实现、您的令牌解析器、您的用户帐户服务、您的业务服务A到N、您的数据库服务(如果有)、您的数据库负载平衡(如果有)、您的数据库实例。
我知道做任何事都很有诱惑力,但试着保持平和,做你需要做的事情。沿着这条路走,你会想到你的产品,我认为这是现在最重要的想法。
为了完成我的回答,关于扩展问题:没关系。无论您选择什么,它都可以无缝扩展:
>
API Gateway应该能够在后端池上工作(因此从该服务器您应该能够重定向到N台后端机器,您可以在需要时投入运行,您甚至可以拥有一些API来支持新实例的自动注册,甚至简单地放置弹性负载均衡器或HAproxor或等价物的IP,当您向它们添加后端时,它就会正常工作——您已经将多个IP问题从API Gateway移至一层)。
如果您在服务级别处理身份验证(并且您有一个API网关),请参见#1
如果您在服务级别(没有API网关)处理身份验证,那么您需要查看堆栈中的其他级别:负载平衡(第3层或第7层)或DNS级别,您可以使用DNS的多个功能放置不同的IP进行应答,如果需要延迟分布,甚至可以使用Anycast等高级功能。
我知道这个答案引出了很多其他问题,但我真的试图回答你的问题。事实上,在规划微服务体系结构时,你需要了解和评估很多事情,如果我办公室的每一面墙上都没有非常书面的计划,我就不会写SLOC。
你通常需要集中精力,退出单一服务,以回顾全球愿景,检查一切是否正常。
我不想吓唬你,我只是想让你认为我会成功。我只是想让你在决定从头开始之前,确保你正确评估了所有的可能性。
另外,如果您选择使用API网关,请确保将服务限制为仅接受通过它的请求。在同一台机器上,只需开始在localhost上监听,在多台机器上,您将需要一些高级网络规则,具体取决于您的操作系统。
祝你好运
我是新的(护照)在laravel。是否有可能使用 即使使用了laravel内置身份验证?
我想通过Spring Cloud介绍Zuul作为一个API网关在少数服务前面。 我关心的问题: > 网关将位于许多服务的前面 某些服务可能公开不需要身份验证的endpoint null
我不熟悉spring微服务世界。由于我处于学习阶段,我尝试并实施了以下内容。 > 路由(能够使用Spring云网关进行路由) 负载平衡(Netflix Eureka) 限速和断路器 我只需要一些澄清和建议,说明在这些情况下该怎么做: 因为我已经创建了身份验证/授权作为一个单独的微服务集中。现在我如何实现这样的每个请求必须包含jwt令牌和通过API网关调用其他微服务也应该检查哪个用户有权限访问其他微
我目前正在为使用typecript、WebStorm、护照和jwt的node.js微服务应用程序开发身份验证服务。在尝试将路由添加到“/api/login”时,我注意到智能感知似乎没有拾取req.user的用户对象或req.header.authorization.的授权对象。例如,以下方法不起作用,因为它找不到用户对象: 我正在使用express中的请求对象: 我需要使用不同的请求对象吗? 此外
我正在尝试使用passport ldapauth npm验证openLDAP用户名和密码。在执行下面的代码时,我总是收到错误消息:“缺少凭据”。请帮助我我的代码有什么问题。 有关更多详细信息,请参阅此badRequestMessage flash消息以查找缺少的用户名/密码(默认值:“缺少凭据”)
背景 我想实现本文中提出的设计。 客户端首先使用IDP(OpenID Connect/oauth2)进行身份验证 IDP返回一个访问令牌(不透明的令牌,没有用户信息) 客户端使用授权头中的访问令牌通过API网关进行调用 API网关使用访问令牌向IDP发出请求 IDP验证访问令牌是否有效,并以JSON格式返回用户信息 API网关将用户信息存储在JWT中,并使用私钥对其进行签名。然后将JWT传递给下游