2016-11-06 162 views
8

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

enter image description here

这里是我的问题和想法:

  • 如何使API网关足够聪明来加载balnce请求,如果我有相同的微服务2节点?
  • 如果其中一项微服务停滞不前,该发现应该如何知道?
  • 有没有类似的实现?我的设计是对的吗?
  • 我应该使用Eureka还是类似的东西?
+0

API网关通常具有负载平衡功能,内置。有些甚至实现了粘滞会话等功能。三种最流行的API网关都是负载平衡器(它们最初并不是作为API网关设计的):haproxy,Nginx和Apache。使用Web服务器和负载均衡器作为API网关的问题是,如果您想添加或删除节点,则需要重新启动网关。我编写了一个API网关,专门用于允许在不重新启动的情况下动态添加和删除节点:https://github.com/slebetman/typhos。它还没有准备好进行生产,但你可以分叉它 – slebetman

+0

另外,由于API网关通常是负载平衡器,它们通常具有检测返回400和500错误的节点的功能。所以通常发现服务只是将url返回给服务,并且该url几乎总是指向API网关。一些架构不使用API​​网关(亚马逊),所以它们所依赖的发现服务来检测击落节点 – slebetman

+0

@slebetman呀我知道,但我从头开始构建它,因为我没有发现任何好的网关做的NodeJS你推荐任何 ? –

回答

3

您的设计是确定的。

  1. 如果您的API网关需要执行(和多数民众可能的情况下),CAS /某种验证(通过服务之一 - 即某种类型的用户服务),还应该跟踪所有请求,并修改头部以承载请求者元数据(用于内部ACL /范围使用) - 您的API网关应该在Node中完成,但应该在Haproxy下,这将关心负载平衡/ HTTPS

  2. 发现位置正确 - if你寻找一个适合你的设计看起来无处可去,但Consul

  3. 您可以使用consul-template或对服务和API-Gateway使用自己的微发现框架,以便它们在启动时共享端点数据。

  4. ACL /授权应该实现每个服务,并且来自API网关的第一个请求应该服从所有授权中间件。

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

  6. 我会为消息/工作者/队列/快速内存中的东西(如缓存/缓存失效)(您无法处理所有MS架构而无需处理)添加Redis - 或者如果有更多分布式事务,则需要使用RabbitMQ;很多消息传递

  7. 将所有这些都放在容器(Docker)上,以便维护和组装。

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

5

您的设计似乎没问题。我们还在使用API​​网关方法构建我们的微服务项目。包括网关服务(GW)在内的所有服务均为容器化(我们使用docker) Java应用程序(弹簧启动dropwizard)。类似的架构也可以使用nodejs来构建。有些话题说与你的问题相关:

  • 认证/授权:的GW服务是为客户的单一入口点。所有认证/授权操作是使用JSON 网络令牌(JWT)具有的NodeJS libray以及在GW处理。我们在JWT令牌中保存授权信息,如用户角色。一旦令牌在GW中生成并返回给客户端,每次请求时客户端都会在HTTP头中发送令牌,然后我们检查令牌是否具有调用特定服务所需的角色或令牌已过期。在这种方法中,你不需要跟踪服务器端的用户会话。其实没有会话。所需信息位于JWT令牌中。
  • 服务发现/负载均衡:我们使用泊坞窗搬运工群这是在泊坞窗引擎(码头工人v.12.1后)捆绑一个码头工人的发动机集群工具。我们的服务是码头集装箱。使用docker的集装箱方法可以轻松部署,维护和扩展服务。在项目开始时,我们使用HAProxy的,Registrator领事一起实现服务发现和负载均衡,类似于绘图。然后,我们意识到,我们不需要他们的服务发现和负载均衡,只要我们创建了一个泊坞窗网络和部署使用泊坞窗群我们的服务。通过这种方法,你可以很容易地通过为每个环境中创建不同的网络建立在一个或多个机器为您服务,如开发,测试,督促隔离的环境。一旦创建了网络并部署了服务,服务发现和负载平衡就不再是您的问题。在同一个码头网络中,每个容器都有其他容器的DNS记录,并且可以与它们进行通信。使用码头群,您可以轻松扩展服务,只需一个命令。在对服务的每个请求中,docker将请求分发(负载均衡)到服务实例。