Skip to content

混合应用

混合应用(hybrid application)指的是同时监听两个或更多不同来源请求的应用。它可以把 HTTP 服务器与微服务监听器组合在一起,也可以只是同时运行多个不同的微服务监听器。

默认的 createMicroservice() 方法并不支持一次创建多个服务器,因此在这种场景下,你必须手动创建并启动每个微服务。为此,可以通过 connectMicroservice() 方法,把 INestApplication 实例与一个或多个 INestMicroservice 实例连接起来。

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

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

提示

app.listen(port) 会在指定地址上启动一个 HTTP 服务器。如果你的应用根本不处理 HTTP 请求,那么应改用 app.init()

如果要连接多个微服务实例,只需对每一个微服务分别调用一次 connectMicroservice()

typescript
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。这是一个枚举,包含所有内置传输策略。

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

@MessagePattern({ cmd: 'time.us' }, Transport.TCP)
getTCPDate(@Payload() data: number[]) {
  return new Date().toLocaleTimeString(...);
}

提示

@Payload()@Ctx()TransportNatsContext 都从 @nestjs/microservices 导入。

共享配置

默认情况下,混合应用不会继承主应用(HTTP 应用)上配置的全局管道、拦截器、守卫和过滤器。

如果你希望微服务继承这些主应用配置,可以在 connectMicroservice() 的第二个参数中传入一个可选配置对象,并将 inheritAppConfig 设为 true

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

基于 NestJS 官方文档翻译