NodeJS中的微服务架构

Sid*_*sef 17 node.js microservices

我正在进行一个侧面项目,并且我将我的Skelton项目重新设计为微服务,到目前为止我没有找到任何遵循这种模式的开源项目.经过大量的阅读和搜索,我总结了这个设计,但我仍然有一些问题和想法.

在此输入图像描述

以下是我的问题和想法:

  • 如果我有来自同一微服务的2个节点,如何使API网关足够智能加载请求加载?
  • 如果其中一个微服务失效,发现应该知道什么?
  • 有没有类似的实施?我的设计是对的吗?
  • 我应该使用尤里卡或类似的东西吗?

sez*_*rug 10

你的设计似乎没问题.我们还使用API​​网关方法构建我们的微服务项目.包括网关服务(GW)在内的所有服务都是容器化(我们使用docker)Java应用程序(spring bootdropwizard).也可以使用nodejs构建类似的体系结构.与您的问题相关的一些主题:

  • 身份验证/授权: GW服务是客户端的单一入口点.使用具有nodejs libray的JSON Web令牌(JWT)在GW中处理所有身份验证/授权操作.我们在JWT令牌中保留用户角色等授权信息.一旦在GW中生成令牌并返回到客户端,在每个请求时客户端在HTTP头中发送令牌,然后我们检查令牌是否客户端具有调用特定服务或令牌已过期所需的角色.在这种方法中,您不需要在服务器端跟踪用户的会话.实际上没有会话.所需信息位于JWT令牌中.
  • 服务发现/负载均衡:我们使用的码头工人,码头工人群这是在泊坞窗引擎(码头工人v.12.1后)捆绑一个码头工人的发动机集群工具.我们的服务是码头集装箱.使用docker的容器化方法可以轻松部署,维护和扩展服务.在项目开始时,我们一起使用Haproxy,RegistratorConsul来实现服务发现和负载平衡,类似于您的绘图.然后我们意识到,只要我们创建一个docker网络并使用docker swarm部署我们的服务,我们就不需要它们来进行服务发现和负载平衡.通过这种方法,您可以通过为每个环境创建不同的网络,轻松地为一台或多台计算机中的dev,beta,prod等服务创建隔离环境.创建网络并部署服务后,您不关心服务发现和负载平衡.在同一个docker网络中,每个容器都有其他容器的DNS记录,并且可以与它们通信.使用docker swarm,您可以使用一个命令轻松扩展服务.在每次请求服务时,docker会将请求分配(加载平衡)到服务实例.


Bla*_*ork 5

您的设计还可以。

  1. 如果您的API网关需要实现(可能就是这种情况)CAS /某种Auth(通过其中一项服务,即某种用户服务),并且还应该跟踪所有请求并修改标头以容纳请求者元数据(以供内部ACL /作用域使用)-您的API网关应在Node中完成,但应在Haproxy下进行,这将关心负载平衡/ HTTPS

  2. 发现处于正确的位置-如果您寻找一个适合您设计的外观,那就是Consul

  3. 您可以对服务和API网关使用领事模板或使用自己的微型发现框架,以便它们在启动时共享端点数据。

  4. ACL /授权应针对每个服务实施,并且来自API Gateway的首次请求应服从所有授权中间件。

  5. 使用API​​网关为每个请求提供请求ID来跟踪请求很聪明,因此可以在“内部”系统中跟踪其生命周期。

  6. 我会为消息传递/工作人员/队列/快速内存中的东西(例如缓存/缓存失效)添加Redis(如果没有一个,您将无法处理所有MS体系结构)-如果您有更多的分布式事务和大量消息传递,则可以使用RabbitMQ

  7. 将所有这些旋转到容器(Docker)上,以便于维护和组装。

  8. 至于BI为什么需要为此提供服务?您可能需要外部ELK Elastisearch,Logstash,Kibana),并同时具有仪表板,日志聚合和巨大的大数据仓库。