混合应用

混合应用是指能够监听来自两个或多个不同来源请求的应用。它可以组合 HTTP 服务器与微服务监听器,甚至只是多个不同的微服务监听器。默认的 createMicroservice 方法不支持多个服务器,因此在这种情况下,每个微服务都必须手动创建和启动。为此,可以通过 connectMicroservice() 方法将 INestApplication 实例与 INestMicroservice 实例连接起来。

const app = await NestFactory.create(AppModule);
const microservice = app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.TCP,
});

await app.startAllMicroservices();
await app.listen(3001);

info 注意 app.listen(port) 方法会在指定地址启动 HTTP 服务器。如果您的应用不处理 HTTP 请求,则应改用 app.init() 方法。

要连接多个微服务实例,需为每个微服务调用 connectMicroservice() 方法:

const app = await NestFactory.create(AppModule);
// microservice #1
const microserviceTcp = app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.TCP,
  options: {
    port: 3001,
  },
});
// microservice #2
const microserviceRedis = app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.REDIS,
  options: {
    host: 'localhost',
    port: 6379,
  },
});

await app.startAllMicroservices();
await app.listen(3001);

要将 @MessagePattern() 绑定到混合应用中多个微服务里的单一传输策略(例如 MQTT),我们可以传入类型为 Transport 的第二个参数,这是一个包含所有内置传输策略定义的枚举。

@@filename()
@MessagePattern('time.us.*', Transport.NATS)
getDate(@Payload() data: number[], @Ctx() context: NatsContext) {
  console.log(`Subject: ${context.getSubject()}`); // e.g. "time.us.east"
  return new Date().toLocaleTimeString(...);
}
@MessagePattern({ cmd: 'time.us' }, Transport.TCP)
getTCPDate(@Payload() data: number[]) {
  return new Date().toLocaleTimeString(...);
}

info 提示@Payload()@Ctx()TransportNatsContext 都是从 @nestjs/microservices 导入的。

共享配置

默认情况下,混合应用不会继承为主应用(基于 HTTP)配置的全局管道、拦截器、守卫和过滤器。要从主应用继承这些配置属性,需在 connectMicroservice() 调用的第二个参数(可选配置对象)中设置 inheritAppConfig 属性,如下所示:

const microservice = app.connectMicroservice<MicroserviceOptions>(
  {
    transport: Transport.TCP,
  },
  { inheritAppConfig: true }
);