【发布时间】:2021-10-26 20:49:38
【问题描述】:
我是 Docker 和 RabbitMQ 的新手,我已经尝试了 2 天来解决我的 docker 容器中的一个错误,其中包含:api_client、api_consumer、RabbitMQ。我做了一项研究并尝试阅读与此问题一样多的线程,但不幸的是没有任何帮助。
这是我的代码: compose.yml
services:
api_client:
build:
context: ""
dockerfile: apps/api_client/Dockerfile
env_file:
- ./config/.env.local
restart: always
ports:
- "3000:3000"
depends_on:
- rabbitmq
api_consumer:
build:
context: ""
dockerfile: apps/api_consumer/Dockerfile
env_file:
- ./config/.env.local
restart: always
depends_on:
- rabbitmq
rabbitmq:
image: rabbitmq:3.9.2-management
container_name: rabbitmq
hostname: rabbitmq
volumes:
- /var/lib/rabbitmq
- ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
ports:
- "5672:5672"
- "15672:15672"
main.ts(在 api_consumer 中)
async function bootstrap() {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
ApiConsumerModule,
{
transport: Transport.RMQ,
options: {
queue: 'test_queue',
urls: ['amqp://guest:guest@rabbitmq:5672'],
queueOptions: {
durable: true
}
}
},
);
const AWSAppConfig = app.get(AwsAppconfigLoaderService);
const Log = new Logger(ApiClientService.name);
await AWSAppConfig.loadAWSAppConfig()
.then((_) => {
Log.log(AWSAppConfig.getAppName());
})
.catch((err) => {
Log.error(
`Error occured while downloading AWS Config: ${JSON.stringify(
err,
)}`,
);
});
await app.listen();
}
bootstrap();
api-client.module.ts(在 api_client 中)
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [AppConfig],
}),
ClientsModule.register([{
name: GET_MATCHED_DEVICES,
transport: Transport.RMQ,
options: {
queue: 'test_queue',
urls: ['amqp://guest:guest@rabbitmq:5672'],
queueOptions: {
durable: true
}
}
},
]),
AwsAppconfigLoaderModule,
],
controllers: [ApiClientController],
providers: [ApiClientService],
})
export class ApiClientModule {}
功能很简单 - 当 localhost:3000 (api_client) 上的 GET 被调用时,它会调用(在控制器中)return this.client.send('getSample', "hello")
然后在 api_consumer 它应该调用(在控制器中)
@MessagePattern('getSample')
getSample(data): string {
Logger.debug(data)
return "It works!";
}
当所有 docker 服务启动时,出现第一个错误:
Disconnected from RMQ. Trying to reconnect.
{
"err": {
"code": 406,
"classId": 60,
"methodId": 40
}
}
然后当我尝试访问 localhost:3000 时,总是出现这个错误:
Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message "PRECONDITION_FAILED - fast reply consumer does not exist"
这两个错误都来自 api_client。
我尝试过但没有帮助的方法:
-将持久性更改为错误或完全删除持久性选项
-添加 noAck
-在 localhost:15672 上的管理员中删除队列(工作正常)
-从两个微服务中的 url 中删除端口
- 如您所见,两个微服务中的队列选项相同
现在最荒谬的是,这段代码确实工作得非常好,直到我开始处理第二个 compose 文件(和 dockerfiles),以便使用卷进行本地(更快)开发。然后突然这些错误开始发生,即使我撤消了所有代码更改,错误仍然存在。因此,我已经多次擦除了所有卷(使用 docker system prune -a --volumes),但仍然没有。我的操作系统是 Ubuntu 20.04
我完全没有想法,所以我把它写在这里希望得到一些帮助。
【问题讨论】:
标签: docker rabbitmq microservices nestjs