NodeJS中的微服务体系结构

我正在做一个侧面项目,并且我重新devise了我的Skelton项目作为微服务,到目前为止我还没有find任何遵循这种模式的开源项目。 经过大量的阅读和search,我总结了这个devise,但我仍然有一些问题和想法。

在这里输入图像描述

这是我的问题和想法:

  • 如何使API网关足够聪明,以加载请求,如果我从同一个微服务2节点?
  • 如果其中一个微服务是closures的发现应该知道?
  • 有没有类似的实现? 我的devise是对的吗?
  • 我应该使用尤里卡还是类似的东西?

你的devise是好的。

  1. 如果你的API网关需要实现(也可能是这种情况)CAS /某种Auth(通过其中一种服务 – 即某种用户服务),还应该跟踪所有请求并修改头来承载请求者元数据对于内部ACL /范围使用) – 您的API网关应该在Node中完成,但应该在Haproxy下,这将关心负载平衡/ HTTPS

  2. 发现是在正确的位置 – 如果你寻找一个适合你的devise看起来无处不在, 领事 。

  3. 您可以使用consul-template或使用自己的micro-discovery-framework作为服务和API-Gateway,以便在启动时共享端点数据。

  4. 每个服务应该实现ACL /授权,并且来自API网关的首先请求应该受到所有授权中间件的约束。

  5. 跟踪API Gateway为每个请求提供请求ID的请求是明智的,因此可以在“内部”系统中跟踪生命周期。

  6. 我会添加Redis的消息/工人/队列/快速内存的东西,如caching/caching失效(你不能处理所有的MS架构没有一个) – 或采取RabbitMQ,如果你有更多的分布式事务和消息

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

  8. 至于BI为什么你会需要一个服务呢? 你可以有外部的ELK Elastisearch,Logstash,Kibana),并且一次有仪表板,日志聚合和庞大的大数据仓库。

你的devise似乎没问题。 我们还在使用API​​网关方法构build我们的微服务项目。 包括网关服务(GW)的所有服务都是集装箱化的(我们使用 docker )Java应用程序( spring引导dropwizard )。 类似的架构也可以使用nodejs来构build。 有些话题与你的问题有关:

  • authentication/授权: GW服务是客户的单一入口点。 所有的authentication/授权操作都在GW中使用JSON Web令牌(JWT)进行处理, JWT也具有nodejs库。 我们在JWT令牌中保存授权信息,如用户angular色。 一旦令牌在GW中生成并返回给客户端,在每个请求中,客户端都会在HTTP头中发送令牌,然后检查令牌是否具有调用特定服务所需的angular色或令牌已过期。 在这种方法中,你不需要跟踪服务器端的用户会话。 其实没有会议。 所需信息位于JWT令牌中。
  • 服务发现/负载平衡:我们使用docker工人docker工人群 ,这是docker引擎中捆绑的docker工具群集工具(在docker v.12.1之后)。 我们的服务是docker集装箱。 使用docker的集装箱方法可以轻松部署,维护和扩展服务。 在项目开始的时候,我们一起使用了Haproxy,RegistratorConsul来实现服务发现和负载平衡,类似于您的绘图。 然后我们意识到,只要我们创build一个dockernetworking并使用docker swarm部署我们的服务,我们就不需要它们来进行服务发现和负载平衡。 通过这种方法,您可以通过为每个环境创build不同的networking,轻松地为您的服务(如dev,beta,prod等)在一台或多台机器上创build独立的环境。 一旦创build了networking并部署了服务,服务发现和负载平衡就不再是您的问题。 在同一个dockernetworking中,每个容器都有其他容器的DNSlogging,并且可以与其进行通信。 使用docker swarm,只需一个命令,就可以轻松扩展服务。 在对服务的每个请求中,docker将请求分配(负载均衡)到服务的一个实例。