除了传统的(有时称为单片)应用程序架构之外,Nest 还支持微服务架构风格的开发。本文档中其他地方讨论的大多数概念,如依赖项注入、装饰器、异常过滤器、管道、保护和拦截器,都同样适用于微服务。Nest 会尽可能地抽象化实现细节,以便相同的组件可以跨基于 HTTP 的平台,WebSocket 和微服务运行。本节特别讨论 Nest 的微服务方面。 在 Nest 中,微服务基本上是一个使用与 HTTP 不同的传输层的应用程序
文档: https://docs.nestjs.com/microservices/basics
Nest 支持几种内置的传输层实现,称为传输器,负责在不同的微服务实例之间传输消息。大多数传输器本机都支持请求 - 响应和基于事件的消息样式。Nest 在规范接口的后面抽象了每个传输器的实现细节,用于请求 - 响应和基于事件的消息传递。这样可以轻松地从一个传输层切换到另一层,例如,利用特定传输层的特定可靠性或性能功能,而不会影响您的应用程序代码。
通俗的讲:Nestjs中的管道可以将输入数据转换为所需的输出。此外,它也可以处理验证,当数据不正确时可能会抛出异常。
$ npm i --save @nestjs/microservicesmain.ts
import { NestFactory } from '@nestjs/core'; import { Transport } from '@nestjs/microservices'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.connectMicroservice({ transport: Transport.TCP, }); await app.startAllMicroservicesAsync(); await app.listen(5000); } bootstrap();app.controller.ts
import { Controller, Get, Query, UsePipes } from '@nestjs/common'; import { MessagePattern, Client, Transport, ClientProxy, } from '@nestjs/microservices'; import { AppService } from './app.service'; import { Observable, from } from 'rxjs'; import { ValidationPipe } from './validation.pipe'; @Controller() export class AppController { @Client({ transport: Transport.TCP }) client: ClientProxy; constructor(private readonly appService: AppService) {} @UsePipes(new ValidationPipe()) @Get() getHello(@Query('data') data): Observablevalidation.pipe.ts{ // const pattern = { cmd: 'sumObservable' }; // const pattern = { cmd: 'sumAsync' }; const pattern = { cmd: 'sum' }; // 使用 send 调用微服务 const r = this.client.send (pattern, data); return r; } @MessagePattern({ cmd: 'sum' }) sum(data: number[]): number { return data.reduce((acc, el) => acc + el); } // 返回promise异步响应 @MessagePattern({ cmd: 'sumAsync' }) sumAsync(data: number[]): Promise { const result = data.reduce((acc, el) => acc + el) + 1; return Promise.resolve(result); } // 程序将响应3次 @MessagePattern({ cmd: 'sumObservable' }) sumObservable(data: number[]): Observable { return from([1, 2, 3]); } }
import { PipeTransform, Injectable, ArgumentMetadata, PayloadTooLargeException, BadRequestException, } from '@nestjs/common'; @Injectable() export class ValidationPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { if (metadata.type === 'query') { try { return JSON.parse(value); } catch (error) { throw new BadRequestException(); } } else { throw new PayloadTooLargeException(); } } }输入:
http://localhost:5000/?data=[1,2, 3] // 6