NestJS:使用Docker的微服务

时间:2020-06-04 06:41:08

标签: docker microservices nestjs

我正在使用微服务,但遇到了问题。我有两个带有微服务的NestJS应用程序。第一个是hybrid appliacation,第二个只是具有app.listen()功能的简单微服务。一切都在Docker-compose中设置。我只想发送一个简单的@EventPattern,但失败了。第二个应用程序未收到任何事件。我正在关注以下主题:https://github.com/nestjs/nest/issues/2532,但它根本没有帮助。这是我写的一些代码:

docker-compose-dev.yml

# First Server
  # --------------------------------------------------
  first-server:
    container_name: first-server
    image: project/firstserver
    build:
      context: ../first-server/
      args:
        UUID: ${UUID}
        UGID: ${GUID}
    environment:
      NODE_ENV: ${NODE_ENV:-development}
    depends_on:
      - db-postgres
      - db-mongo
    user: "${UUID}:${GUID}"
    tty: true
    expose:
      - "3000"
      - "3010"
    ports:
      - "3000:3000"
      - "3010:3010"
    volumes:
      - ../first-server:/app
    networks:
      - servers-network

  # Second Server
  # --------------------------------------------------
  second-server:
    container_name: second-server
    image: project/secondserver
    build:
      context: ../second-server/
      args:
        UUID: ${UUID}
        UGID: ${GUID}
    environment:
      NODE_ENV: ${NODE_ENV:-development}
    depends_on:
      - db-postgres
      - db-mongo
    user: "${UUID}:${GUID}"
    tty: true
    expose:
      - "3100"
      - "3020"
    ports:
      - "3100:3100"
      - "3020:3020"
    volumes:
      - ../second-server:/app
    networks:
      - servers-network

# Docker networks
# --------------------------------------------------
networks:
  servers-network:
    driver: bridge
    name: servers-network

第一服务器:

main.ts

async function bootstrap() {
    const app = await NestFactory.create<NestExpressApplication>(AppModule);
    const microservice = app.connectMicroservice({
        transport: Transport.TCP,
        options: {
            host: '0.0.0.0',
            port: 3010
        }
    });

    await app.startAllMicroservicesAsync();
    await app.listen(port);
}

app.module.ts

@Module({
    imports: [
        TypeOrmModule.forRootAsync({
            useClass: TypeOrmPostgresConfigProvider,
            name: TypeOrmPostgresConfigProvider.connectionName,
            imports: [
                ConfigModule
            ]
        }),
        TypeOrmModule.forRootAsync({
            useClass: TypeOrmMongoConfigProvider,
            name: TypeOrmMongoConfigProvider.connectionName,
            imports: [
                ConfigModule
            ]
        }),
        ServeStaticModule.forRoot({
            rootPath: join(__dirname, '../..', 'public/app')
        }),
        ClientsModule.register([
            {
                name: 'SERVICE_A',
                transport: Transport.TCP,
                options: {
                    host: '0.0.0.0',
                    port: 3010
                }
            }
        ])
    ],
    controllers: [
        AppController
    ],
    providers: []
})

app.controller.ts

export class AppController {

    constructor(
        @Inject('SERVICE_A') private readonly client: ClientProxy
    ) {
    }

    async onApplicationBootstrap() {
        await this.client.connect()
            .then(result => {
                console.log('result');
            })
            .catch(error => {
                console.log(error);
            });
    }

    @Get('hello')
    getHello() {
        this.client.emit<any>('message_printed', new Message('Hi there!'));
        return 'Hello World printed';
    }

    @EventPattern('message_printed')
    async handleMessagePrinted(data: Record<string, unknown>) {
        console.log('first-server event!');
    }

}

第二台服务器

main.ts

async function bootstrap() {
    const app = await NestFactory.createMicroservice<MicroserviceOptions>(
        AppModule,
        {
            transport: Transport.TCP,
            options: {
                host: '0.0.0.0',
                port: 3020
            }
        }
    );

    app.listen(() => console.log('Microservice is listening'));
}

app.controller.ts

export class AppController {

    constructor() {

    }

    @EventPattern('message_printed')
    async handleMessagePrinted(data: Record<string, unknown>) {
        console.log('second-server event!');
    }

}

在两台服务器上,我都有最新版本的NestJS。 Docker版本是19.03.5。

0 个答案:

没有答案