我正在使用微服务,但遇到了问题。我有两个带有微服务的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。