NodeJS中的微服务架构

时间:2016-11-06 09:54:11

标签: node.js microservices

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

enter image description here

以下是我的问题和想法:

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

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

你的设计还可以。

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

  2. 发现处于正确的位置 - 如果你找到一个适合你的设计,但Consul无处可寻。

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

  4. 每个服务都应实施ACL /授权,API Gateway的第一个请求应受所有授权中间件的约束。

  5. 通过API Gateway为每个请求提供请求ID来跟踪请求非常智能,因此可以在内部"内部跟踪生命周期。系统

  6. 我会为消息传递/工作人员/队列/快速内存中的内容添加Redis,例如缓存/缓存失效(您无法处理所有MS架构) - 或者如果您有更多内容,请使用RabbitMQ分布式交易和很多消息

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

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