我正在尝试为rabbitmq和容器的使用者设置单独的docker容器,即侦听队列并执行必要任务的进程.我创建了yml文件和docker文件.
我能够运行yml文件,但是当我检查docker-compose日志时,我看到有ECONNREFUSED错误的位置.
NewUserNotification.js:
require('seneca')()
.use('seneca-amqp-transport')
.add('action:new_user_notification’, function(message, done) {
…
return done(null, {
pid: process.pid,
status: `Process ${process.pid} status: OK`
})
.listen({
type: 'amqp',
pin: ['action:new_user_notification’],
name: 'seneca.new_user_notification.queue',
url: process.env.AMQP_RECEIVE_URL,
timeout: 99999
});
Run Code Online (Sandbox Code Playgroud)
docker-compose日志中的错误消息:
{"notice":"seneca: Action hook:listen,role:transport,type:amqp failed: connect ECONNREFUSED 127.0.0.1:5672.","code":
"act_execute","err":{"cause":{"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1",
"port":5672},"isOperational":true,"errno":"ECONNREFUSED","code":"act_execute","syscall":"connect","address":"127.0.0.1",
"port":5672,"eraro":true,"orig":{"cause":{"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1",
"port":5672},"isOperational":true,"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":5672},
"seneca":true,"package":"seneca","msg":"seneca: Action hook:listen,role:transport,type:amqp failed: connect ECONNREFUSED 127.0.0.1:5672.",
"details":{"message":"connect ECONNREFUSED 127.0.0.1:5672","pattern":"hook:listen,role:transport,type:amqp","instance":"Seneca/…………/…………/1/3.4.3/-“,
”orig$":{"cause":{"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":5672},"isOperational":true,
"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":5672}
Run Code Online (Sandbox Code Playgroud)
示例docker-compose.yml文件:
version: '2.1'
services:
rabbitmq:
container_name: "4340_rabbitmq"
tty: true
image: rabbitmq:management
ports:
- 15672:15672
- 15671:15671
- 5672:5672
volumes:
- /rabbitmq/lib:/var/lib/rabbitmq
- /rabbitmq/log:/var/log/rabbitmq …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将项目从当前的单体状态转移到微服务架构。该项目在 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' });
});
Run Code Online (Sandbox Code Playgroud)
并分块接收:
seneca.add({ role: 'file', cmd: 'chunk' }, writeToFileCb);
seneca.add({ role: …
Run Code Online (Sandbox Code Playgroud) 我是seneca的菜鸟,我只是想尝试使用Node js从开发微服务中运行示例代码,它说:
var seneca = require('seneca')();
seneca.add('role:api,cmd:bazinga',function(args,done){
done(null,{bar:"Bazinga!"});
});
seneca.act('role:web',{use:{
prefix: '/my-api',
pin: {role:'api',cmd:'*'},
map:{
bazinga: {GET: true}
}
}})
var express = require('express');
var app = express();
app.use( seneca.export('web') ); // <<<<<< this line might be the cause
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)
但我得到一个错误,上面写着:
TypeError: app.use() requires middleware functions at EventEmitter.use (/home/oem/node_modules/express/lib/application.js:209:11) at Object. (/home/oem/Documents/seneca/app.js:7:8) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12) at Function.Module.runMain (module.js:441:10) at startup (node.js:139:18) at node.js:974:3
此外,我试图运行从网络上复制的另一个示例代码,对不起,我只是可以找到链接.但我只是复制,粘贴并试图运行,我得到了同样的错误.我认为这更像是一个设置问题?
编辑
我还在尝试玩这个.我理解这一点的方式是在app.use行,基本上我只是调用seneca-web模块.所以我做的是
app.use(require('seneca-web'))
Run Code Online (Sandbox Code Playgroud)
代替
app.use( seneca.export('web') ) …
Run Code Online (Sandbox Code Playgroud) 我一直在玩Docker容器中设置一些微服务,其中服务基于Seneca.js.由于这是一个Node.js应用程序,我派生了容器"FROM node".但是,容器映像的大小约为600 MB.不完全是"微观".最终的应用程序将使用几个这样的服务的集合,如果每个服务器的大小超过600 MB,它将把应用程序炸成几GB.
我做错了什么,或者你是如何设置基于Docker-Node.js的微服务?
非常感谢.
干杯,
马丁