【问题标题】:Architecture for microservices微服务架构
【发布时间】:2015-12-26 14:23:19
【问题描述】:

我最近开始使用 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 网关和微服务之间构建通信逻辑的正确方法是什么?

【问题讨论】:

    标签: node.js express microservices


    【解决方案1】:

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

    【讨论】:

    • 感谢您的评论。
    【解决方案2】:

    我会做的是,

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

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

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

    【讨论】:

    • 感谢您的回答,但我需要完全分离数量的服务,并通过某种协议(如 HTTP 或 WebSockets)在它们之间进行通信
    • 分离可以深入到核心模块中单个方法的级别。顶层,即路由处理程序,仍然不知道核心模块如何为其提供数据。
    猜你喜欢
    • 2016-11-23
    • 2018-03-29
    • 2019-03-23
    • 2016-11-22
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多