微服务架构

Architecture for microservices

我最近开始使用 node.js,我必须构建一个应该使用多个 express.js 服务的架构。其中一些服务必须位于一台服务器上,而另一些则位于其他服务器计算机上。我想构建一个基础服务(如 API 网关),但我不知道在该网关与微服务之间或两个微服务之间进行通信的正确方法是什么。

目前我正在使用基于此的解决方案:

# inside Gateway server I call another service:
http.get('http://127.0.0.1:5001/users', (service_res) ->
  data = ''
  service_res.on 'data', (chunk) ->
    data += chunk

  service_res.on 'end', ->
    # some logic on data

).end() 

我强烈觉得这种做法是不对的。在 API 网关和微服务之间构建通信逻辑的正确方法是什么?

我会做的是,

  1. 为每个微服务创建单独的模块。根据你想要的微服务 运行,只需在 express 中有一个路由即可。
  2. 将您想要的模块注入 express().
  3. 的实例中

例子+无耻外挂-https://github.com/swarajgiri/express-bootstrap/blob/master/core/index.js

免责声明 - 上述解决方案是解决您的问题的一种非常自以为是的方法。

您的逻辑并没有错,但可能更好的做法是在向其他服务发出请求的基础上构建一个抽象层,例如。 API 通往另一个微服务的网关。让我们为这个实例调用微服务 B(API 网关向 B 发出请求)。

在这种情况下,B 应该向自己的客户端提供其他服务应该如何与其交互的信息,无论是通过 HTTP 还是 WebSockets,协议由 B 决定,因为 B 知道应该如何与它通信。客户端和服务一起实现的论点是,这两个组件应该具有更高级别的内聚性,因为从技术上讲,它们受合同约束,例如。如果需要向服务发出请求,则需要遵守服务要求的合同。

使用 Express 的简单伪代码:

// implemented elsewhere, ideally next to the service that it communicates with
function BServiceClient() {
  // ...
}

// the API gateway's calling code
app.get('...', function(request, response, next) {
  // create an instance of the service client
  var bServiceClient = new BServiceClient();

  // retrieving the users from an abstracted endpoint
  bServiceClient.GetUsers();

  // do some processing and then render a response or call next
});

为了使其更易于测试,您可能必须围绕 app 编写自己的包装器,以执行适当的依赖注入以注入客户端,从而使路由更易于测试。否则,您可以创建另一个可以注入客户端的函数,并在调用新创建的函数的处理程序级别创建客户端。然后可以测试新创建的函数。但是,我更喜欢使用包装器的前一种方法。希望这对您有所帮助!