如何将 Nest.js 微服务拆分为单独的项目?

2024-03-20

假设我想创建一个简单的影院管理平台。它需要很少的微服务:movies, cinemas, payments, etc.

你会如何在 Nest.js 中做到这一点?我不希望它们位于同一个大文件夹中,因为这感觉就像制作一个整体。我希望它们成为单独的 Nest.js 项目,拥有自己的 git 存储库,以便稍后我可以使用 Kubernetes 来编排它们。

如何?如何从服务连接cinemas服务movies如果它们是两个独立的项目并且只共享 Redis?

编辑: 这不是一个关于一般微服务的问题。这是 Nest.js 特有的问题。我阅读了文档,我知道有像这样的装饰器@Client用于连接到传输层。我只是想知道在哪里使用该装饰器,也许会看到一段关于“拥有两个独立的 Nest.js 存储库如何将它们连接在一起以便它们可以相互通信”的简短代码片段。

我不关心传输层,那东西我可以自己搞清楚。我只需要一些关于框架本身的建议,因为我认为缺乏文档。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Nest.js 微服务拆分为单独的项目? 的相关文章

随机推荐