比方说,我想创建一个简单的电影管理平台。它需要很少的微服务:movies
,cinemas
,payments
等。
您将如何在Nest.js中做到这一点?我不想将它们放在一个大文件夹中,因为这就像制作一个整体。我希望它们是具有自己的git存储库的单独的Nest.js项目,以便以后可以使用Kubernetes对其进行编排。
如何?如果服务cinemas
是两个单独的项目,并且仅共享(例如,Redis),那么如何从服务movies
连接到服务@Client
?
编辑:
一般来说,这不是关于微服务的问题。这是Nest.js特有的问题。我阅读了文档,我知道有db.Customers_DEV.update(
{"fn": "QA_Isabel10K"},
{
$set: {
"db" : ISODate("1988-08-17T06:00:00.000Z")
}
});
这样的装饰器用于连接到传输层。我只想知道在哪里使用该装饰器,并且可能会看到一段简短的代码,内容是“具有两个单独的Nest.js存储库,如何将它们连接在一起,以便它们可以彼此通信”。
我不在乎传输层,我可以自己弄清楚这一点。我只需要一些有关框架本身的建议,因为我认为缺少文档。
答案 0 :(得分:12)
我知道了。基本上,方法是创建两个单独的项目。假设-一个是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
创建新项目时得到的最简单的示例,则在控制器中执行此操作。 / p>
控制器代码:
@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
部分从构造函数移动到提供程序,然后通过在模块中声明提供程序来使用依赖项注入。