我最近开始使用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网关和微服务之间构建通信逻辑的正确方法是什么?
最佳答案
您所拥有的逻辑并不正确,但可能更好的是在向另一个服务发出请求的基础上构建一个抽象层,例如。另一个微服务的 API 网关。我们为此实例调用该微服务 B(向 B 发出请求的 API 网关)。
在这种情况下,B 应该提供自己的客户端来了解另一个服务应如何与其交互,无论是通过 HTTP 还是 WebSockets,协议(protocol)由 B 决定,因为 B 知道应该如何与其通信。客户端和服务一起实现的论点是,这两个组件应该具有更高水平的内聚力,因为从技术上讲,它们受到契约(Contract)的约束,例如。如果需要向服务发出请求,则需要遵守该服务所需的契约(Contract)。
使用 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
编写自己的包装器,以执行正确的依赖项注入(inject)来注入(inject)客户端,从而使路由更易于测试。否则,您也许能够创建另一个可以注入(inject)客户端的函数,并在调用新创建的函数的处理程序级别创建客户端。然后可以测试新创建的函数。但是,我更喜欢使用包装器的前一种方法。希望这有帮助!
关于node.js - 微服务架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32838312/