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

时间:2018-09-10 22:31:56

标签: node.js typescript microservices nestjs

比方说,我想创建一个简单的电影管理平台。它需要很少的微服务:moviescinemaspayments等。

您将如何在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存储库,如何将它们连接在一起,以便它们可以彼此通信”。

我不在乎传输层,我可以自己弄清楚这一点。我只需要一些有关框架本身的建议,因为我认为缺少文档。

1 个答案:

答案 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部分从构造函数移动到提供程序,然后通过在模块中声明提供程序来使用依赖项注入。