我正在尝试将项目从其当前的整体状态转移到微服务架构。该项目在 Node.js 中,所以我开始研究Seneca.js,尤其是它的seneca-mesh模块。将图像操作(裁剪、调整大小等)移动到微服务中似乎是最明智的第一步,因为它现在大大降低了我的应用程序的速度。
当应用程序是单体时,将某些文件传递到文件操作逻辑中没有问题——只需从本地存储磁盘中读取即可。然而,对于微服务,如果我们牢记可扩展性,它就会变得更加困难。当然,我可以构建一个图像处理微服务,在同一主机上扩展它,并在它之间共享我需要的目录,这样它们也可以从本地磁盘读取。
如果我想要一个真正可扩展的微服务,它可以在具有不同 IP 地址且不共享相同文件系统的不同机器上运行和扩展?我想也许我可以利用 Node 的流 API 并通过 HTTP 或 TCP 或套接字来回发送这些文件,或者你命名它。
据我所知,Seneca.js 无法以正确的方式做到这一点。当然,我可以通过 Seneca.js 将文件从主应用程序发送到图像处理服务,如下所示:
fs.createReadStream('/files/hello.jpg')
.on('data', function(data) {
seneca.act({ role: 'file', cmd: 'chunk', data: data }, cb);
})
.on('end', function(err) {
seneca.act({ role: 'file', cmd: 'end' });
})
.on('error', function(err) {
seneca.act({ role: 'test', cmd: 'error' });
});
并分块接收:
seneca.add({ role: 'file', cmd: 'chunk' }, writeToFileCb);
seneca.add({ role: 'file', cmd: 'end' }, endFileWriteCb);
但这种方法看起来很丑陋,而且是轮回式的。
另一种方法是提供一些 HTTP 服务器并将文件作为multipart/form-data
or发送application/octet-stream
,如下所示:
fs.createReadStream('file.json')
.pipe(request.post('http://image-manipulator'))
但这意味着重新发明微服务通信的框架。总而言之,我就分布式微服务之间的文件共享以及可能的框架寻求建议。