我成功了.基本上,方法是创建两个独立的项目.比方说,一个是createMicroservice
,另一个只是HTTP应用(但很容易成为另一种微服务).我使用了一个"普通"的应用程序,这样我就可以方便地调用它进行测试.
下面是创建microservice的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'];
}
}
现在——在微服务中,您声明控制器应该对哪些类型的事件做出react (@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
部分从构造函数移动到提供程序,然后通过在模块中声明提供程序来使用依赖项注入.