微服务的体系结构

我最近开始使用node.js,我必须构build一个应该使用多个express.js服务的体系结构。 其中一些服务必须位于一台服务器上,另一台服务器上。 我想构build一个基本的服务(比如API网关),但是我不知道在这个网关和微服务之间或者在两个微服务之间进行通信的正确方式。

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

# 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网关和微服务之间build立通信逻辑的正确方法是什么?

你所拥有的逻辑并不是不正确的,但最好是在向另一个服务发出请求的基础上构build一个抽象层。 另一个微服务的API网关。 让我们只是为这个实例调用微服务B(API网关向B请求)。

B在这种情况下应该为自己的客户机提供另一个服务如何与它交互,无论是通过HTTP还是WebSocket,协议都是B,因为B知道如何与之通信。 客户和服务一起实施的理由是,这两个组成部分应该具有更高的凝聚力,因为从技术上来说,他们受到合同约束。 如果需要对服务进行请求,则需要遵守服务所需的合同。

在简单的伪代码与快递:

 // 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 }); 

为了使它更易于testing,你可能需要在app程序周围编写自己的包装器来做适当的dependency injection来注入客户端来使路由更可testing。 否则,您可能可以创build另一个可以注入客户端的函数,并在调用新创build函数的处理程序级别创build客户端。 然后可以testing新创build的函数。 但是,我更喜欢使用包装的前一种方法。 希望这可以帮助!

我会做的是,

  1. 为每个微服务创build单独的模块。 根据你想要运行的微服务,只需要一个路由表示。
  2. 将你想要的模块注入到express()一个实例中。

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

免责声明 – 上述解决scheme是解决您的问题的高度自以为然的方式。