微服务架构

时间:2015-09-29 07:37:32

标签: node.js express 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网关和微服务之间构建通信逻辑的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

你拥有的逻辑并不是错误的,但更好的是在向另一个服务发出请求之前构建一个抽象层,例如。另一个微服务的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周围编写自己的包装器来执行适当的依赖注入,以便注入客户端以使路由更易于测试。否则,您可能能够创建另一个可以注入客户端并在调用新创建的函数的处理程序级别创建客户端的函数。然后可以测试新创建的函数。但是,我更喜欢使用包装器的前一种方法。希望这有帮助!

答案 1 :(得分:0)

我会做的是,

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

    示例+无耻插件 - https://github.com/swarajgiri/express-bootstrap/blob/master/core/index.js

    免责声明 - 上述解决方案是解决您问题的高度自觉的方式。