混合应用
混合应用(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()、Transport 和 NatsContext 都从 @nestjs/microservices 导入。
共享配置
默认情况下,混合应用不会继承主应用(HTTP 应用)上配置的全局管道、拦截器、守卫和过滤器。
如果你希望微服务继承这些主应用配置,可以在 connectMicroservice() 的第二个参数中传入一个可选配置对象,并将 inheritAppConfig 设为 true:
typescript
const microservice = app.connectMicroservice<MicroserviceOptions>(
{
transport: Transport.TCP,
},
{ inheritAppConfig: true },
);