Я получил это работает.В основном, способ сделать это - создать два отдельных проекта.Допустим, один - createMicroservice
, а другой - просто приложение HTTP (но может легко стать другим микросервисом).Я использовал «обычное» приложение, чтобы можно было легко вызывать его для тестирования.
Вот файл main.ts
, который создает микросервис.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Transport } from '@nestjs/common/enums/transport.enum';
async function bootstrap() {
const app = await NestFactory.createMicroservice(AppModule, {
transport: Transport.REDIS,
options: {
url: 'redis://localhost:6379',
},
});
await app.listen(() => console.log('MoviesService is running.'));
}
bootstrap();
И один из контроллеров:
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@MessagePattern({ cmd: 'LIST_MOVIES' })
listMovies(): string[] {
return ['Pulp Fiction', 'Blade Runner', 'Hatred'];
}
}
Теперь - в микросервисе вы объявляете, на какие события должны реагировать контроллеры (@MessagePattern
).Находясь в «нормальной» службе, вы делаете это в контроллере, когда хотите что-то спросить у других микросервисов (main.ts
- самый простой пример, который вы получаете, когда создаете новый проект с использованием @nestjs/cli
.
Код контроллера:
@Controller()
export class AppController {
private readonly client: ClientProxy;
constructor(private readonly appService: AppService) {
this.client = ClientProxyFactory.create({
transport: Transport.REDIS,
options: {
url: 'redis://localhost:6379',
},
});
}
@Get()
listMovies() {
const pattern = { cmd: 'LIST_MOVIES' };
return this.client.send<string[]>(pattern, []);
}
}
Так что, пока client
подключен к тому же транспортному уровню, что и микросервис - они могут общаться друг с другом, используя @MessagePattern
.
Для лучшего кода вы можете переместить часть this.client
из конструктора в поставщика, а затем использовать внедрение зависимостей, объявив поставщика в модуле.