NestJS的微服务


NestJS官网对其微服务的定义:
In Nest, a microservice is fundamentally an application that uses a different transport layer than HTTP.
一个不使用HTTP作为传输层协议的App,就叫微服务。

这对于微服务的描述有点偏差,但不管怎么说,先按照教程实现一个demo。
npm i -g @nestjs/cli
nest new rocket-app
cd rocket-app
npm i --save @nestjs/core@latest @nestjs/common@latest
npm run start
访问 localhost:3000, 出现Hello World!

cd src && mkdir Rocket && cd Rocket
nest generate service Rocket --flat
nest generate controller Rocket –flat

修改app.module.ts

import { Module, HttpModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { RocketService } from './Rocket/rocket.service';
import { RocketController } from './Rocket/rocket.controller';

@Module({
  imports: [HttpModule],
  controllers: [AppController, RocketController],
  providers: [AppService, RocketService],
})
export class AppModule {}

rocket.service.ts

import { Injectable, HttpService } from '@nestjs/common';
import { map } from 'rxjs/operators';

@Injectable()
export class RocketService {
  constructor(private http: HttpService) {}

  getNextLaunchRemainingTime() {
    return this.http.get('https://api.spacexdata.com/v4/launches/next').pipe(
      map((response) => response.data),
      map((launch) => launch.date_utc),
    );
  }
}

Rocket.controller.ts

import { Controller, Get } from '@nestjs/common';
import { RocketService } from './rocket.service';

@Controller('rocket')
export class RocketController {
  constructor(private rocketService: RocketService) {}

  @Get('next-launch')
  getNextLaunchRemainingTime() {
    return this.rocketService.getNextLaunchRemainingTime();
  }
}

访问:http://localhost:3000/rocket/next-launch

现在准备转换为微服务的架构
npm i --save @nestjs/microservices
修改main.ts

import { NestFactory } from '@nestjs/core';
import { Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.createMicroservice(
    AppModule,
    {
      transport: Transport.TCP,
      options: {
        host: '127.0.0.1',
        port: 8877,
      },
    },
  );
  app.listen(
    () => console.log(
      'Microservice is listening on port 8877'
    ));
}
bootstrap();

修改Rocket.controller.ts

import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';
import { Observable } from 'rxjs';
import { RocketService } from './rocket.service';

@Controller('rocket')
export class RocketController {

  constructor(private rocketService: RocketService) { }

  @MessagePattern('get-next-launch-remaining-time')
  getNextLaunchRemainingTime(): Observable<string> {
    return this.rocketService.getNextLaunchRemainingTime();
  }

}

下面准备建立Client App
nest new rocket-client
npm i --save @nestjs/microservices
cd src && mkdir Rocket && cd Rocket
nest generate service Rocket --flat
nest generate controller Rocket –flat

rocket.service.ts

import { Injectable } from '@nestjs/common';
import { ClientProxyFactory, Transport, ClientProxy } from '@nestjs/microservices';

@Injectable()
export class RocketService {
  client: ClientProxy;

  constructor() {
    this.client = ClientProxyFactory.create({
      transport: Transport.TCP,
      options: {
        host: '127.0.0.1',
        port: 8877,
      },
    });
  }

  getNextLaunchRemainingTime() {
    return this.client
      .send<string, string>(
        'get-next-launch-remaining-time', '',
      );
  }
}

Rocket.controller.ts

import { Controller, Get } from '@nestjs/common';
import { RocketService } from './rocket.service';

@Controller('rocket')
export class RocketController {
  constructor(private rocketService: RocketService) {}

  @Get('next-launch')
  getNextLaunchRemainingTime() {
    return this.rocketService.getNextLaunchRemainingTime();
  }
}

分别启动服务端和client端, npm run start
访问:http://localhost:3000/rocket/next-launch

源码链接


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM