如何拆分 Nest.js 个微服务到单独的项目中?
How to split Nest.js microservices into separate projects?
假设我想创建一个简单的影院管理平台。它需要很少的微服务:movies
、cinemas
、payments
等
你会如何在 Nest.js 中完成它?我不希望它们在同一个大文件夹中,因为那感觉就像在制作一个整体。我希望它们是独立的 Nest.js 项目,拥有自己的 git 存储库,这样我以后就可以使用 Kubernetes 对它们进行编排。
怎么样?如何从服务 cinemas
连接到服务 movies
如果它们是两个独立的项目并且只共享,比方说,Redis?
编辑:
一般来说,这不是关于微服务的问题。这是一个 Nest.js 具体的问题。我阅读了文档,我知道有像 @Client
这样的装饰器用于连接到传输层。我只想知道在哪里使用该装饰器,也许可以在 "having two separate Nest.js repositories how to connect them together so they can talk to each other".
上看到一小段代码
我不关心传输层,那东西我自己搞定。我只需要一些关于框架本身的建议,因为我认为缺少文档。
我成功了。基本上,方法是创建两个单独的项目。比方说 - 一个是 createMicroservice
而另一个只是一个 HTTP 应用程序(但很容易成为另一个微服务)。我使用了一个 "normal" 应用程序,以便我可以轻松调用它进行测试。
这是创建微服务的 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
)。在 "normal" 服务中,当您想向其他微服务请求某些东西时,您可以在控制器中执行此操作(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
部分从构造函数移至提供者,然后通过在模块中声明提供者来使用依赖注入。
假设我想创建一个简单的影院管理平台。它需要很少的微服务:movies
、cinemas
、payments
等
你会如何在 Nest.js 中完成它?我不希望它们在同一个大文件夹中,因为那感觉就像在制作一个整体。我希望它们是独立的 Nest.js 项目,拥有自己的 git 存储库,这样我以后就可以使用 Kubernetes 对它们进行编排。
怎么样?如何从服务 cinemas
连接到服务 movies
如果它们是两个独立的项目并且只共享,比方说,Redis?
编辑:
一般来说,这不是关于微服务的问题。这是一个 Nest.js 具体的问题。我阅读了文档,我知道有像 @Client
这样的装饰器用于连接到传输层。我只想知道在哪里使用该装饰器,也许可以在 "having two separate Nest.js repositories how to connect them together so they can talk to each other".
我不关心传输层,那东西我自己搞定。我只需要一些关于框架本身的建议,因为我认为缺少文档。
我成功了。基本上,方法是创建两个单独的项目。比方说 - 一个是 createMicroservice
而另一个只是一个 HTTP 应用程序(但很容易成为另一个微服务)。我使用了一个 "normal" 应用程序,以便我可以轻松调用它进行测试。
这是创建微服务的 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
)。在 "normal" 服务中,当您想向其他微服务请求某些东西时,您可以在控制器中执行此操作(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
部分从构造函数移至提供者,然后通过在模块中声明提供者来使用依赖注入。