我成功了。基本上,执行此操作的方法是创建两个单独的项目。比方说 - 一个是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
从构造函数到提供程序的一部分,然后通过在模块中声明提供程序来使用依赖项注入。